在android studio 3.2中本人调用jni不使用nkd-build这个方式而是采用cmake的方式。
下面是主要内容:
- jni文件的建立
- jni的基本实现
- jni传参
环境配置:
在SDK Tools中要添加CMake LLDB NDK点击OK,等待下载完成,下载完成后,重启Android Studio
开始新建JNI项目
-
直接新建一个项目,注意在“Include C++ support”前面打勾
-
直接下一步
-
选择“Empty Activity”,下一步
-
继续下一步
-
选择C++版本,如果要用到C++ 11的新特性,就选择C++ 11,不然就默认
-
稍等一会,等待Android Studio自动构建完成
-
查看一下目录文件
- 先简述一下jni调用大概流程
- 首先需要说明的是在Android Studio中有JNI调用的框架,所以和我们使用命令行调用JNI有点不同,这里不需要将.java中的native方法生成.h,再建立.cpp文件实现方法。这里跳过了.h,可以直接在.cpp文件里面实现native方法
- MainActivity中有native方法
- native-lib.cpp中有实现native方法的函数
- 通过CMakeLists.txt将native-lib.cpp编译成.so动态库
- MainActivity就可以调用这个.so文件
- MainActivity文件
- native-lib.cpp文件
在native-lib.cpp实现了该方法 - CMakeLists.txt文件,英文注释已经删除,中文注释已经注好
- 不需要我们更改任何文件,点击运行app,运行成功
- 我们来看一生成的.so文件,目前只生成了x86架构的.so,别的架构的可以自己百度一下
- 这个就是基本的流程
下面我们自己添加几个本地方法并实现他们
- 在MainActivity中添加2个本地方法fun1和fun2,因为我们还没有具体实现他们,所以是红色的。
- 在native-lib.cpp中实现函数
- 修改MainActivity中的方法,将stringFromJNI()改成fun1()
- 点击运行app,显示"im fun1"
- 至此,jni的从java端到c++已经基本实现了
这一片段我们介绍jni的传参,jni的传参内容比较多,本篇博客只做最基本的讲解,如需深入请看专门的博客
jni传参主有两个部分:
- 把java中的形参传入到C++中
- 在C++代码中操作java中的属性及类
下面分别来讲这三部分
1.把java中的形参传入到C++中。如果java中方法中带参数,则生成的jni函数中也是带参数的。
我们把fun2()改成带参数的方法。
接下来在native-lib.cpp中实现它
我们通过上面这张图可以看到,我们在函数参数中添加了jstring para,这对应了java中的String para。
然后我们将jstring类型的para赋值给c++的string类型的hello,发现错误,提示类型不匹配。所以,如果我们想在c++代码中操作jstring类型的数据,必须先将jstring转化成string。(jint jfloat等基本类型可以直接赋值,但是要注意字节数)
将jstring转化成string有很多方法,本文只讲比较简单的一种
一共5句代码
将MainActivity.java中的stringFromJNI()修改成fun2("world")
运行app,结果
2.在C++代码中操作java类中的属性及方法
在native-lib.cpp中修改fun1()
修改MainActivity.java
运行app,查看日志
可以看到执行fun1前,x为初始化的8,执行fun1后,改为100了
jni传参的基本方法就是这些,如果想要更全面的,就要去看专门的博客了。