Jni开发在android开发中至关重要,下的linux上到android的java,他的角色至关重要。但开发入门级别的菜鸟就可能遇到好多问题。
下面我将给大家分享一些我在开发jni过程中的一些小经验,让大家可以快速解决一下实际开发中遇到问题。
1、针对java文件方法生成相应jni的.h头文件,
按照网上说的javac 然后javah 。。等命令发现有些问题,我的做法是
2、首先在Eclipse中新建相应java文件的过程,写好相应的方法,编译运行(会报错不过没关系,只要生成相应bin即可)
然后进入bin目录,执行调用:javah -classpath . -jni 包名.类名
我发现也只有这方法才可以正常生成h文件,其他网上方法都是会报错的
3、jni中编译.c和编译.cpp是不同的,.c下有一些函数完全可以编译过,但是在.cpp中就不一定可以编译过,
例如:.c下
让java层的string转换成c层的char*:const char *path = (*env)->GetStringUTFChars(env, string, 0);即可
但是在c++下是编译不过的:又必须写成const char *path = env->GetStringUTFChars(string, 0);
还有一些struct类型也必须在cpp下进行强制类型转换
4、针对apk加载jni生成的so会报/AndroidRuntime( 3179): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load。。。。的错,
下面我给出apk对so的一个加载过程:
在代码里,使用
System.loadLibrary("xxx");
就可以加载这个动态库了。
这里要注意,参数只写xxx就可以了,不需要写libxxx,也不需要写libxxx.so。
还有一点要说明,System.loadLibrary这个函数会在如下路径搜索libxxx.so文件:
/system/lib
/data/data/you apk package/lib
所以必须要保证你的so在这2个目录之一,记住不要将so集成到jar包里面,那样也会报出找不到的错,而你还一直认为已经集成了