jni 交叉编译 android 平台下使用

一,准备工作:
1)下载android ndk包,解压 
2)下载交叉编译工具链 
     1,cd ./android-ndk-r15c
     2,./build/tools/make-standalone-toolchain.sh --package-dir=/home/fxb/open_source/ndk_tools/ --toolchain=arm-linux-androideabi-4.8
     3,tar xjvf arm-linux-androideabi.tar.bz2
     4,配置环境变量

二,交叉编译
1)./configure CXX=arm-linux-androideabi-g++  -includedir /home/fxb/open_source/ndk_tools/arm-linux-androideabi/include/c++/4.9.x -libdir /home/fxb/open_source/ndk_tools/arm-linux-androideabi/lib64 --prefix=/home/fxb/open_source/ndk_tools/arm-lib CXXFLAGS=-D__ANDROID_API__=21
遇到编译错误百度解决。
2)makefile 仿照configure设置

三,构造jni接口
1)创建一个java 类,编写native接口
2)javah -jni ***Jni.java    生成***Jni.h 头文件
3)引用***.h头文件,实现***.c 
4)编译jni库
5)在***Jni.java 构造函数里加载jni库 :System.loadLibrary("LogPrintJni");

四,android studio 引用jni库
1)在 android 工程目录中 新建 \LogTest\app\src\main\jniLibs\armeabi-v7a 目录,将jni库放在armabi-v7a目录内
2)将**Jni.java 放置*.java目录 内 \LogTest\app\src\main\java\gomain\logtest,修改**Jni.java包路径,以适应工程包路径
3)创建***Jni.java对象,引用接口


遇到的坑:
1,jni库的位置不对,加载不到库。
释疑:armv5,armv7 ,x86,mips,armv8 等是cpu架构,当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。
不同CPU架构的Android手机加载时会在libs下找自己对应的目录,从对应的目录下寻找需要的.so文件;
如果没有对应的目录,就会去armeabi下去寻找,如果已经有对应的目录,但是如果没有找到对应的.so文件,也不会去armeabi下去寻找了。

2,jni库缺少依赖库,加载不到库。
将交叉编译后依赖库放置jni库相同目录内。

3,jni库目标版本与apk版本不一致,加载不到库。


4,native接口找不到。解决方案,确保***Jni.h的接口路径与引用的***Jni.java的包路径一致。

5,显示字符乱码。
原因:byte 是字节数据类型 ,是有符号型的,占1 个字节;大小范围为-128—127 。char 是字符数据类型 ,是无符号型的,占2字节(Unicode码 );大小范围 是0—65535 ;char是一个16位二进制的Unicode字符,JAVA用char来表示一个字符 。

你可能感兴趣的:(c与c++,操作系统,开源库)