在 Android Studio 3.1 中使用预构建的 JNI 库



我得到了一个共享对象(*.so文件),我需要从我的应用程序中引用它。我知道共享对象使用 JNI。现在,我在Android应用程序开发方面有一些经验,但没有原生代码的经验。我在StackOverflow和Google上看了很多答案,但似乎都不适合我的问题。

基本上,这个共享对象是用于另一个应用程序,我有该应用程序的代码,现在我需要在我的应用程序中实现它。我不知道我应该从哪里开始或应该做什么。如果有人可以帮助指导我完成这个过程,那就太好了。

另外,我没有共享对象的源文件和头文件。我确实知道本机方法的名称。

如果您没有最初定义这些本机方法的 Java 源代码,则通常可以从.so文件本身对必要的本机方法定义进行反向工程。 例如,如果库导出Java_com_example_testjni_MainActivity_stringFromJni,则必须添加一个 Java 类

package com.example.thestjni;
class MainActivity {
public native static String stringFromJni();
}

这不会为本机方法提供正确的参数或返回类型。此外,还必须猜测是否应将本机方法声明为静态方法。

为了安全起见,您将向此类添加一个静态构造函数,以确保加载库:

package com.example.thestjni;
class MainActivity {
static {
System.loadLibrary("thirdparty");
}
public native static String stringFromJni();
}

您可以根据自己的喜好自由重命名第三方库,但不能重命名包,也不能重命名类。您不在乎原始 Java 类是否声明了本机方法私有,您可以在项目中安全地将其声明为 public

要查找预构建库libthirdparty.so导出的 JNI 函数的名称,您可以使用 Android NDK 工具链随附的nm工具:

nm -D libthirdparty.so | grep Java_

如果您有使用它的另一个应用程序的 Java 代码 - 请在调用它的其他库中查找 Java 代码。 这些函数应使用关键字 native 定义。 获取该类,而不重命名或更改包,并将其放入项目中。 现在,您可以通过 Java 本机函数定义调用这些本机函数。

当然,如果没有源代码,您将无法针对任何其他体系结构进行编译。 因此,希望您拥有所有适当文件的 .so 文件。 请记住,如果这些类不适合您,请加载库。

最新更新