Android Studio目前的最新版本(3.4)在使用cmake编写Jni代码时,与之前旧版本的Android Studio有些许不同,这里记录下来,供大家参考。
旧版本AS里cmake的使用这里就不再赘述,下面单讲最新版AS(3.4)创建cmake的步骤。
首先我们新建一个Android工程,FileNewNew Project,注意,在创建新工程时,我们要选择创建一个“Native C++”工程,如图:
这里是与旧版本AS不同的地方,这种方法创建出来的就是一个可以直接使用Jni的工程(当然你也可以选择创建一个Basic或者Empty工程,创建完之后手动创建和设置CMakeLists文件) 。接下来设置你的工程名,包名,路径等:
其中最小API级别(也就是你的工程支持的最低API版本,打包成的App只能运行在API比此版本高的Android手机上)可以在这里设置,也可以创建完在gradle里修改。下面的步骤默认就好。
创建完成后,我们把工程目录切换到Project下:
看到的目录结构应该是下面这样:
可以看到cpp文件夹下出现了我们所期望的CMakeLists.text 文件和一个.cpp文件,并且编写好了一个Jni例子。直接打包运行App,可以看到运行结果是在手机上输出了:
Hello from C++
如果你是第一次使用Jni,那么恭喜你成功地运行了你人生中的第一个使用Jni的Android Native工程。
下面我们简单分析下这个Native工程。
首先我们来看下CMakeLists.text文件:
特别的要生成的动态库的源码文件在本工程里就是native-lib.cpp。这里我们的源码文件与库名相同了,实际二者不必要相同,可以任意设置,但一般与我们要实现的功能相关 。
接下来我们看下MainActivity:
可以看到MainActivity里首先加载了我们在CMakeLists里定义的动态库 ,然后声明了一个native的方法stringFromJNI(),这个方法在onCreate里被调用。正是这个方法实现了Java代码调用C++/C代码。
打开native-lib.cpp,在这个源文件里,定义了一个与MainActivity里native方法对应的Jni方法:
Jni里返回值类型与对应的java端接收的类型要一致,一般是基础数据类型前面加上j,具体可以问度娘(或者参考这篇博客https://blog.csdn.net/aitumingmumu/article/details/72802949,感谢博主分享!)。
重点在于Jni方法名的定义。Jni的方法名一般分为四个部分,如图,
第一部分是Java标识,意思是该方法对应于java端的方法;
第二部分是java端对应的方法所在的包名(点.换成下滑线_);
第三部分是java端对应的方法所在的类名;
第四部分是Java端对应的方法的方法名;
所以也可以理解成Jni方法名是由java端对应方法的相对路径构成(main路径下) 。
好了,到这里就把一个最简单的Android Native 工程介绍完了。接下来的博客我会具体讲下在此基础上的动态链接库(共享库).so文件的生成和使用。
您的赞赏是我坚持分享的最大动力 :)