从android java调用C外部库(.so)



我正在编写一个示例android应用程序来演示使用我们的(大学研究) C/c++库。

我知道,使用jni,我们可以从java调用C函数。然而,我还没有找到一步一步的说明如何在Android Studio Artic Fox中做到这一点。

我已经看到编写与jni兼容的C包装器函数的需要,但还没有找到如何做到这一点(正确形成的函数签名)或将它们放在哪里。

另外,我需要在项目设置中更改什么才能正确构建项目(使用gradle) ?

请注意,我必须直接使用预构建的。so文件和公共头文件,它为库定义了一组公共C函数。

有很多例子给出了部分过时的信息,但仍然没有全面-或者我错过了什么?

我在下面整理了一个快速指南,但我想先澄清一下它们是如何组合在一起的。在Android应用程序中,您可以将native方法绑定到从本机库加载的特殊命名的函数。这些特殊命名的函数接收指向JNIEnv结构体的指针,以便与嵌入的Java应用程序交互。

本机库通常使用CMake构建。任何外部依赖(比如你的预构建库)都需要在CMake的CMakeLists.txt中可见。这里选择的武器是导入库,它们正是你所认为的那样。

的步骤首先,用Kotlin作为语言创建一个Android项目。
右键单击树顶端的应用程序并选择"将c++添加到模块"生成必要的构建文件

改变你的MainActivity。Kt文件为:

class MainActivity : AppCompatActivity() {
external fun doit();
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val nativeThread = Thread {
doit()
}
nativeThread.start()
}
}

您将得到一个构建错误,声明"无法解析相应的JNI函数"。如果您选择快速修复,Android Studio将生成一个.cpp文件,其中包含适当的JNI包装器代码。

生成的函数如下所示:
extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapplication_MainActivity_doit(JNIEnv *env, jobject thiz) {
// TODO: implement doit()
}

及以上将是关于如何从Kotlin加载本机库的说明。将代码复制到MainActivity.kt.

编辑这个。cpp文件来做任何你需要对你的原生库做的事情(例如#include一些文件和调用一些函数)。

最后,编辑app/src/main/cpp/CMakeLists.txt指向你的头文件和预编译库。

最新更新