这几天研究了一下安卓涉及到 JNI 相关的知识点,本以为很简单的东西,结果实现起来各种错误,现在总结一下贴出来
希望有帮助
这篇文章,只介绍使用 Cmake 去编译 so 文件,NDK 的先不讨论,个人觉得 ndk 比较麻烦
1、首先需要下载 Cmake,这个 AS 都自带了功能,见下图
Cmake 是一个编译工具,LLDB 应该是一个 NDK 下的调试工具,NDK 不必说了,三个都更新一下
如果使用 NDK 的话,需要配置 NDK 的环境变量
2、新建一个项目,注意哦,不要勾选 Include C++ Support
最好不要勾选,我们需要一步一步来
3、在项目的 main 目录下新建 cpp 文件夹,并且建立你需要的.cpp .h 文件
JniTest.h JniTest.cpp native-lib.cpp(CmakeLists.txt 稍后再讲)
这里简单贴一下三个文件的源码,就是求(a+10)的值,native-lib.cpp 是开放给 java 层调用的,再里面负责调用 JniTest 里面的内容
JniTest.h:
#ifndef JNITEST_CMAKE_MAX_H
#define JNITEST_CMAKE_MAX_H
int test(int a);
#endif //JNITEST_CMAKE_MAX_H
JniTest.cpp:
int test(int a) {
return 10 + a;
}
native-lib.cpp:
#include <jni.h>
#include "JniTest.h"
extern "C" {
jint
Java_com_test_MainActivity_maxFromJNI(
JNIEnv* env,
jobject object,
jint a)
{
return test(a);
}
}
(JNIEnv* env,jobject object)这两个是必须要的,后面的 jint a 是接受 java 层的参数
下面看 CmakeList.txt
指定 cmake 最低版本,如果不知道就复制吧
cmake_minimum_required(VERSION 3.4.1)
第一个 native-lib 是供 java 调用的文件, SHARED 是啥没看明白但是要写上
最后俩是所有 cpp 的名字和相对本文件的位置,这里在一个文件夹中就直接写名字了,文件有多少写多少
add_library(native-lib SHARED native-lib.cpp JniTest.cpp)
我的理解是 java 要连接到 native-lib,和一些其它的东西,不懂
target_link_libraries(native-lib)
照着这个写就好了
4、最后配置一下 app gradle
5、现在在 java 层调用就好啦
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.text);
textView.setText(maxFromJNI(14) + "");
}
public native int maxFromJNI(int a);
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于