JNI开发环境说明

交叉编译

1、在一个平台下编译出另一个平台可以执行的二进制程序

2、CPU平台:arm,x86,mips

3、系统平台:Windows、Linux、Mac OS

4、 原理:模拟另一个平台的特性去编译代码

源代码->预编译->编译->链接->可执行程序

工具链:一个工具使用完毕自动使用下一个

--------------------------------------------------------------------------------------------------------------------------------------------

常见工具

NDK:native development kits

CDT:C/C++ development tools:eclipse插件、高亮显示C关键字

cygwin:Windows平台下的Linux命令行模拟器

--------------------------------------------------------------------------------------------------------------------------------------------

NDK目录结构

docs:帮助文档

build/tools:Linux批处理文件

platforms:存放开发jni用到的h头文件和so动态链接库

prebuilt:预编译使用的工具

sample:使用jni的案例

source:NDK的部分源码

toolchains:工具链

ndk-build.cmd:编译打包C代码的指令

-------------------------------------------------------------------------------------------------------------------------------------------

JNI步骤

1. 定义并调用本地方法

2. 创建jni文件夹

3. jni文件夹里创建c文件

4. c文件中实现本地方法,格式如下

//返回值与本地方法一致

//函数名:Java_包名_类名_本地方法名

//env:结构体二级指针,该结构体中封装了大量的函数指针,可以帮助程序员实现某些常用功能

//thiz:本地方法调用者的对象(MainActivity的对象)

jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject thiz)

5. 创建Android.mk文件,指定要编译的c文件

6. 在jni目录下,执行ndk-build.cmd,编译打包出so动态链接库

7. 在java代码中加载动态链接库

8. 部署,运行

常见错误:找不到类库、没有添加对应平台的支持、类库名写错了、找不到本地方法、忘记加载类库、c函数名写错了

添加其他平台架构支持,在jni文件夹中添加Application.mk如下写法即可,all表示添加所有的平台支持

javah指令

自动生成jni样式的头文件,头文件中就包含了我们需要的函数名

JDK1.7:在src目录下使用:javah com.xpu.addfromc.MainActivity

JDK1.6:在bin/classes目录下使用:

1、添加本地支持

2、自动生成jni文件夹

3、自动生成c文件和Android.mk文件

4、指定jni.h头文件的路径,相当于关联源码

5、不需要再去jni目录下使用ndk-build.cmd指令,项目部署时,会先打包编译so类库再去部署到手机上

数组传递: java的数组是对象,传递对象是传递对象的地址,c函数中修改了地址上的值,所以数组的值就改变了

javap指令的使用:

打印指定类中所有方法的签名

在bin/classes目录下使用:javap -s com.itheima.helloworld2.MainActivity

JNI的副作用:

一旦使用JNI,JAVA程序就丧失了JAVA平台的两个优点:

1、程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。

2、程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,你应该让本地方法集中在少数几个当中。这样就降低了JAVA和C之间的耦合性

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/81109818