Linux c 语言一些字符串操作函数的实现
c 语言对字符串的操作函数有很多都没有实现,比如 java 中的 trim、indexOf、substring 等等,于是就动手实现了几个字符串操作函数,以备以后开发中使用。
c 语言对字符串的操作函数有很多都没有实现,比如 java 中的 trim、indexOf、substring 等等,于是就动手实现了几个字符串操作函数,以备以后开发中使用。
最近在自己的音乐播放器项目中要加入跑马灯效果,于是便研究了下。跑马灯效果是 TextView 自带的一个属性,使用 TextView 来实现单个、多个跑马灯效果比较简单。
Android JNI 开发时,如何注册 JNI 的方法,Java 才能调用,下面说一下 JNI 的两种注册方法。
所谓静态注册就是调用 java 的命令工具 javah 来生成头文件,然后再实现头文件中的所有函数即可。这种方法比较简单,首先在命令行中(我这里使用的是 windows cmd,linux、mac 是一样的),进入到 src 目录下,然后执行:
1 | $ javah -d E:\SourceCode\Android\JniTest\ -jni com.coolerfall.HelloJni |
其中 - d 表示生成的头文件的输出目录,可以自行设置,com.coolerfall.HelloJni 是包含有 native 方法的类,native 方法如:
1 | public static native void init(); |
最后生成一个 com_coolerfall_player_HelloJni.h 头文件,接下来就可以新建一个 c 文件实现这些函数就 ok 了。
在 Android 开发中不免会使用到 JNI,JNI 编程中可以使用 javah 等工具自动生成 jni 的头文件,但是如果想自己手动注册,那么就需要了解 JNI 方法的签名规范,记录一下,以备以后查看。
最近在 linux 使用 ndk 编译一些东西,就使用到了 shell 脚本,结果在执行的时候出现:
bash: ./build_android.sh: /bin/bash^M: bad interpreter: No such file or directory
使用 vim 打开 shell 脚本,发现并没有问题,最后发现是由于 shell 脚本在 windows 下编写的,copy 到 linux 后文本格式不对,所以只需要更改一下文本格式就可以了,用 vim 打开 shell 脚本,在命令行模式下:
:set fileformat=unix
最后保存退出就可以执行了。
Android 的四种 launchMode 是我们比较常用的基础点,但是有时候很容易就混淆了。Activity 一共有四种启动方式:standard、singleTask、singleInstance、singleTop,四种方式各有个的特点,在不同情况下会使用不同的启动方式。
现在在项目中 git 的使用已经比较频繁了,难免会遇到各种各样的小问题,这里记录下这些问题。
error: RPC failed; result=22, HTTP code = 411
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
这个是因为 http buffer 不够造成的,可以简单配置 git 来解决:
git config http.postBuffer 67108864
直接添加到.ignore 中是不能成功的,因为已经 push 到服务器了,需要先删除本地缓存的文件:
1 | $ git rm -r --cached .idea |
然后再将其添加到.ignore 中,最后 git push 就 ok 了
最近在做一个像豌豆荚游戏文件类似的东西,但是遇到个奇怪的问题,就是应用打开后 home 键退出,然后再点击文件夹,会同时弹出文件夹以及 home 退出之前的界面,经过一番折腾,算是整明白了问题。首先说说 taskAffinity,每个 application 创建的时候,都会有 taskAffinity,默认情况下同一个 application 下的所有 activity 都属于同一个 taskAffinity,都会在相同的 task 中。而这里创建的文件夹快捷方式,相当于是让其指定到了应用的某个 acitivity,如果没有给这个 activity 指定 taskAffinity 的话,那么将会与前面的 activity 运行在相同的 task 中,也就是在打开快捷方式后,若前面的 activity 未 finish 掉,这个时候会从栈中弹出,出现我所遇到的问题。最后在文件夹快捷方式指定的 activity 中加入 android:taskAffinity=":icon"
,问题就解决了。
用 AS 开发也有一段时间了,发现 AS 可以使用 maven,在 gradle 中可以很方便的解决依赖问题,再也不用去下载相应的 jar 包了。gradle 添加一些依赖库比较方便,但是如果想把自己的一些开源项目上传到 maven 中央库给别人使用,就稍微有些麻烦了。现在比较简单的办法是先将自己在 github 上的项目提交到 Sonatype,然后再同步到 maven 中央库去,大致说一下流程。
很多应用在卸载后都会弹出一个网页做用户卸载反馈,这就需要监听 App 的卸载,但是应用一旦卸载就不会再执行任何程序了,如何才能弹出网页,答案就是在应用开启时就 fork 出一个子进程来,在进程中对 App 进行卸载监听。在 linux 中有个东西叫 inotify,可以对指定的文件进行监听(包括修改,删除等等),基本的流程就是 inotify_init->inotify_add_watch->inotify_event,在 inotify_event 读取操作的时候是阻塞的,一直会等到指定的文件变动后才会往下执行。