您的位置:首页 > 编程语言 > C语言/C++

Android Cmake 编译c,c++源文件,实现JNI调用

2017-07-14 17:39 645 查看
这几天研究了一下安卓涉及到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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android Cmake JNI