在androidstudio2.2以前,对jni的编译只有一种就是ndkbuild. 这是一个很痛苦的过程,写native方法,jnih生成c文件等等。而起编写c/C++代码是没有代码提示的!!!!,在2.2之后官方出现了一种新的编译方式cmake,而且是官方推荐的,最重要的是有代码提示,而且方便易懂!
阅读前最好先阅读下官方的文档
https://developer.android.google.cn/studio/projects/add-native-code#link-gradle
准备工作环境配置
下载这两个选项和ndk(ndk在底下没显示出来)并安装
Cmake是编译用的
LLdb是调试用的
一:新建一个支持c/c++的工程
在2.2后这个界面多了这么一个选项,勾选上他。点击完成,新建完项目就可以运行了
CmakeLists.txt内容解析,如果想生成多个库,可以多写几个add_library()
这个cmake是规定源文件位置和库名称库配置的一些信息可是,androidstudio怎么找到这个CmakeLists.txt文件的呢?是在gradle中配置的
它的位置是在app目录下你通过它指定了CmakeLists.txt的位置再通过这个文件找到源代码的位置和配置
你可能说没看见so文件啊,其实它已经打进包里了,你将apk包解压下就可以看见lib文件夹下有.so文件,在这个文件夹下也可以看见
二:导入之前的jni项目
1.先测试一个只含有一个类的简单例子
在main下新建cpp文件夹,然后新建demo.cpp文件
在app文件夹下新建CmakeLists.txt文件内容如下
cmake_minimum_required(VERSION 3.4.1)
add_library(
demo-lib
SHARED
src/main/jni/demo.cpp
)
现在是已经把原文件的位置和配置搞定了,然后需要项目关联CmakeLists.txt文件有两种方式
一种ui方式一种终极方式
ui方式:选择android视图在app右键选择LinkC++projectwithgrade
在project path选择CmakeLists.txt的路径
新建测试类
新写个native方法,此时会报红!,
使用快捷方式可以自动生成方法代码厉害不厉害
有时候会自动生成demo-lib.c文件,可以把里面的方法复制到demo.cpp中,楼主也不知道为啥会出现这种情况,然后把jni文件夹删掉
主意!!:需要加入extern"C"在代码之下,否则回报找不到native方法的错误
系统自动生成方法的时候没有extern"C",需要自己加上,这里去掉注释就好。这是因为C和C++的符号表不相同造成的。jni是按照C的生成规则去找函数的, 所以在函数声明的时候要加上extern C使编译器把函数按照C的规则编译 这样才能被Java调用。
然后就可以测试了
public class MainActivityextends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Cmake cmake=new Cmake();
Toast.makeText(MainActivity.this,cmake.stringFromJNI(),Toast.LENGTH_LONG).show();
}
}
2.含有多个文件的例子
新建文件夹a a a,并加入新源码test.h和test.cpp
这两个文件封装了一个加法方法;
CmakeList 更改为
源码native-lib.cpp改为
在mainactivity中调用