上一篇我们讲述了通过ndkBuilder的方式,最后再补充一点.
如果你前面的操作都成功了,最后会在你该module的builde/intermediates/ndk/debug/lib目录下生成so库,
你可以直接使用so库,效果是一样的
我这里已经把jni文件夹删掉,然后创建了一个jniLibs,把刚刚的so库拷过来,然后运行代码效果是一样的.(ps 使用全部编译,别用Instant Run,否则如果有问题是表现不出来的)
—-叫我分割线———————-
2.使用cmake进行项目的构建
– 1.首先在创建project的时候勾选Include c++ support(注意,是创建project,不是module)
– 2.选择c/c++的标准
上面的配置你也可以直接在你module的build.gradle的defaultConfig节点中设置,效果是一样
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
//cppFlags "-std=c++11"
}
}
– 3.在build.gradle中的android节点下面会增加配置,指定生成so文件配置文件的路径
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
– 4.创建需要调用C/C++代码的java代码,和ndkBuilder相同
public class JniUtils {
public static native String getString();
}
– 5.编写你的c/c++代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_cmakedemo_utils_JniUtils */
#ifndef _Included_com_cmakedemo_utils_JniUtils
#define _Included_com_cmakedemo_utils_JniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_cmakedemo_utils_JniUtils
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_cmakedemo_utils_JniUtils_getString
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
JNIEXPORT jstring JNICALL Java_com_cmakedemo_utils_JniUtils_getString
(JNIEnv *env, jclass jobj){
return (*env)->NewStringUTF(env,"HelloWorld");
}
– 6.配置你的CMakeLists.txt文件
创建CMakeLists.txt文件配置如下
cmake_minimum_required(VERSION 3.4.1) #指定cmake版本
add_library(HelloWorld SHARED src/main/jni/HelloWorld.c) #括号中第一个 HelloWorld是生成的so文件的名称,要和你c/c++文件名相同
target_link_libraries(HelloWorld log android) # 此处增加了,日志的链接库
注意,上面代码中三个HelloWorld的地方必须一致,和你c/c++文件名相同
– 7.静态导包
public class JniUtils {
static{
System.loadLibrary("HelloWorld");// 你在cmakeList中设置的名称
}
public static native String getString();
}
– 到这里你所有的配置就完成了,你可以调用JniUtils中的getSting方法获取c/c++中的字符串
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) this.findViewById(R.id.tv);
tv.setText(JniUtils.getString());
}
}
遇到的问题
讲道理按照我上面的步骤一步一步来,是不会有什么问题的,如果不讲道理,那只能说
如果你遇到了什么问题,欢迎留言,最后屌大/胸大的同学麻烦帮忙顶一下