android studio 3.2 使用jni

在android studio 3.2中本人调用jni不使用nkd-build这个方式而是采用cmake的方式。

下面是主要内容:

  • jni文件的建立
  • jni的基本实现
  • jni传参

环境配置:

在SDK Tools中要添加CMake LLDB NDK点击OK,等待下载完成,下载完成后,重启Android Studio

android studio 3.2 使用jni_第1张图片

开始新建JNI项目

  1. 直接新建一个项目,注意在“Include C++ support”前面打勾android studio 3.2 使用jni_第2张图片

  2. 直接下一步
    android studio 3.2 使用jni_第3张图片

  3. 选择“Empty Activity”,下一步
    android studio 3.2 使用jni_第4张图片

  4. 继续下一步
    android studio 3.2 使用jni_第5张图片

  5. 选择C++版本,如果要用到C++ 11的新特性,就选择C++ 11,不然就默认android studio 3.2 使用jni_第6张图片

  6. 稍等一会,等待Android Studio自动构建完成

  7. 查看一下目录文件android studio 3.2 使用jni_第7张图片

  8. 先简述一下jni调用大概流程
    1. 首先需要说明的是在Android Studio中有JNI调用的框架,所以和我们使用命令行调用JNI有点不同,这里不需要将.java中的native方法生成.h,再建立.cpp文件实现方法。这里跳过了.h,可以直接在.cpp文件里面实现native方法
    2. MainActivity中有native方法
    3. native-lib.cpp中有实现native方法的函数
    4. 通过CMakeLists.txt将native-lib.cpp编译成.so动态库
    5. MainActivity就可以调用这个.so文件
  9. MainActivity文件
    android studio 3.2 使用jni_第8张图片
  10. native-lib.cpp文件
    android studio 3.2 使用jni_第9张图片
    在native-lib.cpp实现了该方法
  11. CMakeLists.txt文件,英文注释已经删除,中文注释已经注好
    android studio 3.2 使用jni_第10张图片
  12. 不需要我们更改任何文件,点击运行app,运行成功
    android studio 3.2 使用jni_第11张图片
  13. 我们来看一生成的.so文件,目前只生成了x86架构的.so,别的架构的可以自己百度一下
    android studio 3.2 使用jni_第12张图片
  14. 这个就是基本的流程

下面我们自己添加几个本地方法并实现他们

  1. 在MainActivity中添加2个本地方法fun1和fun2,因为我们还没有具体实现他们,所以是红色的。
    android studio 3.2 使用jni_第13张图片
  2. 在native-lib.cpp中实现函数
    android studio 3.2 使用jni_第14张图片
  3. 修改MainActivity中的方法,将stringFromJNI()改成fun1()
    android studio 3.2 使用jni_第15张图片
  4. 点击运行app,显示"im fun1"
    android studio 3.2 使用jni_第16张图片
  5. 至此,jni的从java端到c++已经基本实现了

这一片段我们介绍jni的传参,jni的传参内容比较多,本篇博客只做最基本的讲解,如需深入请看专门的博客

jni传参主有两个部分:

  • 把java中的形参传入到C++中
  • 在C++代码中操作java中的属性及类

下面分别来讲这三部分

1.把java中的形参传入到C++中。如果java中方法中带参数,则生成的jni函数中也是带参数的。

我们把fun2()改成带参数的方法。

接下来在native-lib.cpp中实现它

android studio 3.2 使用jni_第17张图片

我们通过上面这张图可以看到,我们在函数参数中添加了jstring para,这对应了java中的String para。

然后我们将jstring类型的para赋值给c++的string类型的hello,发现错误,提示类型不匹配。所以,如果我们想在c++代码中操作jstring类型的数据,必须先将jstring转化成string。(jint jfloat等基本类型可以直接赋值,但是要注意字节数)

将jstring转化成string有很多方法,本文只讲比较简单的一种

android studio 3.2 使用jni_第18张图片

一共5句代码

将MainActivity.java中的stringFromJNI()修改成fun2("world")

android studio 3.2 使用jni_第19张图片

运行app,结果

android studio 3.2 使用jni_第20张图片

2.在C++代码中操作java类中的属性及方法

在native-lib.cpp中修改fun1()

android studio 3.2 使用jni_第21张图片

修改MainActivity.java

android studio 3.2 使用jni_第22张图片

运行app,查看日志

android studio 3.2 使用jni_第23张图片

可以看到执行fun1前,x为初始化的8,执行fun1后,改为100了

jni传参的基本方法就是这些,如果想要更全面的,就要去看专门的博客了。

你可能感兴趣的:(Java)