Android Studio 中通过Jni调用C&C++

JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。JNI标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持、保证本地代码能工作在任何JVM就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。
在android studio调用Jni接口,使用C&C++实现某些功能的步骤和网上查到的在普通的Java程序中实现Jni的调用有较大的不同,故进行相关总结。
首先来看一下我的Android Studio版本。
Android Studio 中通过Jni调用C&C++
文章图片

本文以新建一个调用Jni的安卓工程为例,进行相关说明。(如果需要在没有Jni调用的安卓工程中加入Jni的调用,则需要在app目录下加入CMakeLists.txt,并修改app目录下的build.gradle文件,在其中加入CMakeLists.txt的路径,及cmake的相关选项。然后在/app/src/main目录下新建cpp文件夹,可以在cpp文件夹中新建src和include,分别将本地的.cpp和.h文件加入,修改.cpp文件中相关函数的包名和类名即可。然后在java文件中需要加入static{System.loadLibrary("yourlib"); }。之后具体CMakeLists.txt怎么写,build.gradle文件中相关的cmake选项怎么写,需要具体分析。
Android Studio 中通过Jni调用C&C++
文章图片

  1. 打开android studio新建一个工程,并勾选Include C++ support。
  2. 之后默认next,如果需要改包名和Activity的名称可自行修改。

3.到C++ Standard,勾选Exceptions Support和Runtime Type Information Support。
Android Studio 中通过Jni调用C&C++
文章图片

【Android Studio 中通过Jni调用C&C++】4.点finish即可创建完成。
5.打开后会发现在MainActivity.java文件中自动创建了stringFromJNI()这个native函数。
Android Studio 中通过Jni调用C&C++
文章图片

6.因为在android studio中会把cpp文件编译为.so(shared object)文件,所以需要在java文件中显式加载动态库文件。因为我们新建工程时选择了C++ Support,所以会在MainActivity.java文件中自动创建加载动态库文件的方法。如果在工程中还需要加载其他的动态库,则需要以同样的方法显式加载相应的动态库。
Android Studio 中通过Jni调用C&C++
文章图片

7.追踪这个函数,可发现其在native-lib.cpp中,实现了stringFromJNI()这个函数。
Android Studio 中通过Jni调用C&C++
文章图片

8.如果需要调用其他的cpp函数,则首先需要在java文件中定义该函数。
Android Studio 中通过Jni调用C&C++
文章图片

9.此时myNewJniFun()函数并没有与之对应的Jni接口,将鼠标点击到myNewJniFun()函数上,可以看到在此函数的左上方有一个小红灯的提醒标志。
Android Studio 中通过Jni调用C&C++
文章图片

10.点击此小红灯标志,然后点击弹出来的第一个选项”Create function Java_android_example_com_myapplication_MainActivity_myNewJniFun”。
Android Studio 中通过Jni调用C&C++
文章图片

11.点击后即可在native-lib.cpp文件中自动创建myNewJniFun()函数。其命名规则为Java_包名_类名_函数名。函数中的前两形参为自动生成。第一个参数的意思是运行环境为JVM的环境,第二个参数的意思是该项目。
Android Studio 中通过Jni调用C&C++
文章图片

12.至此,创建一个新的Jni调用的函数已经创建完成。接下来在native-lib.cpp中实现函数的相关功能即可。

    推荐阅读