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

本贴最后更新于 1947 天前,其中的信息可能已经时过境迁

这几天研究了一下安卓涉及到 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

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 70 关注
  • JNI
    6 引用 • 2 回帖
  • cmake
    4 引用 • 2 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...