3.5.1 , Android Studio的版本是
3.5.1
找了两个小时的博客, 硬是没找到能用的... 算了, 自力更生, 丰衣足食
新建项目的时候, 记得选择 Native C++
之前版本的 include c++ support 选项在这个版本中已经独立出去了...
File -> Project Structure... -> SDK Location -> Android SDK Location
在Android视图下, 打开 local.properties , 看到ndk的路径已经配置完成
新建一个类, 声明 native 方法. 这个类是java与C/C++交互的中介, 方法 由java声明, 由C/C++实现
这里为了方便接下来的操作, 切换成 Project 视图
public class myJNI {
static {
System.loadLibrary("JniTest"); // 要加载的so的名字
}
public static native String sayHello();
}
虽然这里的 sayHello() 方法报错了, 但是不用管
javac 编译上述文件, 生成class文件
确认自己的包名和类名, 然后在 java目录 使用 javah 包名.类名 命令生成 .h 头文件, 然后就能看到生成了一个 .h文件
注意一定要在 java层目录 下输入命令, 不然不会报错: 找不到xxx类
com_example_test_myJNI.h 拖到 cpp 目录下
cpp 目录下的 native-lib.cpp
cpp 目录下新建 main.c
main.c 中的内容, 首先是将头文件包括进来, 然后实现头文件中的 sayHello 方法
#include "com_example_test_myJNI.h"
JNIEXPORT jstring JNICALL Java_com_example_test_myJNI_sayHello(JNIEnv *env, jclass jobj)
{
return (*env)->NewStringUTF(env,"hello 52pojie!");
} 注意: 这时候可以看到上面报错了, 先别管, 下面我们就来解决它
CMakeLists.txt 来指定 so名称 和 so的源文件的相对路径
然后 sync 一下
发现 main.c 已经不报错了
Build -> Rebuild Project 来生成so库
生成的so在 app/build/intermediates/cmake/debug/obj/ 或者 app/build/intermediates/merged_native_libs/debug/out/lib 或者 app/build/intermediates/stripped_native_libs/debug/out/lib/
ps: 这几个路径中的so库, 我暂时不知道区别在哪...哪位大佬知道的话, 麻烦留言说一声.
注意: 这里的so名字 = lib + 我们在CmakeLists.txt中起的名字 + .so
在 app/src/main 下新建 jniLIB 目录, 并将生成的SO文件拷贝到该文件夹下
这里的so库, 我测试的时候选择的是 app/build/intermediates/merged_native_libs/debug/out/lib 路径下的, 其他的请自测
打开MainActivity插入一条log来调用so中的 sayHello 方法,并连接手机调试