先上一张NDK学习的视频截图,对NDK有个简单了解
- NDK目录配置
我们打开Android Studio Project Structure ,配置好已下载好的NDK包
- 配置NDK环境后,来实现一个简单helloJni功能。我们首先创建一个Hello.java
package cn.cutcopy.jni;
public class Hello {
// 就一个native方法
public static native String sayHello();
}
如下图所示,cd 到 src/main/java目录下,直接执行javah命令
-
第二步执行完毕后,我们会生成一个jni目录
-
接下来创建一个简单的Hello.cpp文件
//
// Created by Aaron on 2019/5/6.
// 导入第三步的.h文件
#include "cn_cutcopy_jni_Hello.h"
// 实现最简单返回一个字符串的方法
JNIEXPORT jstring JNICALL Java_cn_cutcopy_jni_Hello_sayHello(JNIEnv * env, jclass jclass1){
return env->NewStringUTF("from c");
}
- 然后我们还需要创建一个Android.mk文件
# 定义模块当前路径
LOCAL_PATH := $(call my-dir)
# 清空当前环境变量
include $(CLEAR_VARS)
# 编译该模块所需的源码
LOCAL_SRC_FILES := \
Hello.cpp \
LOCAL_LDLIBS := -ldl -llog
# 编译生成的文件名
LOCAL_MODULE := Hello
# 告诉Ndk编译成动态库
include $(BUILD_SHARED_LIBRARY)
- 此时需要在app的module下做一下配置
android {
......
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
}
- 此时将第二步的Hello.java稍微做下修改
public class Hello {
static {
System.loadLibrary("Hello");
}
public static native String sayHello();
}
- 如果上面7步没报错的话,可以在Java中调用测试一下
@ContentView(R.layout.jni_act)
public class JniAct extends BaseActivity {
TextView text;
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
text = findViewById(R.id.text);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
text.setText(Hello.sayHello());
}
});
}
}
此时最简单的Hello jni应该算是完成了
- 那么我们生成的.so文件了?
项目build目录下即可看到,当然我们也可以通过abiFilters配置生成指定架构的.so
文章最开始图中,应该有涉及到:
NDK环境配置
,jni头文件
,编写native方法
,Android.mk
6.
参考