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

时间:2018-04-07 16:13:26

标签: java android c++ java-native-interface

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

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

另外,我没有共享对象的源文件和头文件。我知道原生方法的名称。

2 个答案:

答案 0 :(得分:1)

如果您没有最初定义这些本机方法的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();
}

您可以根据自己的喜好重命名3 rd 派对库,但不能重命名包而不是类。您不关心原始Java类是否声明了本机方法 private ,您可以在项目中安全地声明 public

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

nm -D libthirdparty.so | grep Java_

答案 1 :(得分:0)

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

当然,如果没有源代码,您无法针对任何其他架构进行编译。所以希望你有所有适当的.so文件。如果这些课程不适合你,请记得加载图书馆。