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

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

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

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

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

最佳答案

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

package com.example.thestjni;

class MainActivity {
    public native static String stringFromJni();
}

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

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

package com.example.thestjni;

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

您可以根据自己的喜好自由重命名第 3rd 方库,但不能重命名包和类。您不关心原始 Java 类是否将 native 方法声明为 private,您可以安全地在您的项目中将其声明为public

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

nm -D libthirdparty.so | grep Java_

关于java - 在 Android Studio 3.1 中使用预构建的 JNI 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49709359/

相关文章:

java - AsyncTask 中的 Volatile 和 Synchronized

java - Windows:如何获取所有可见窗口的列表?

android - ImageView 掉落时闪烁

android - 如何从输入字段发送电子邮件 - 我的代码调试

c++ - 删除基于数组的列表中的项目

c++ - 通过 .net 互操作类调试 COM C++ 代码

java - Eclipse 下载包中没有服务器选项

java - 可缩放图片 - Android

c++ - 如何在编译时推断出两种类型共有的继承树的根(如果存在)?

java - Hibernate 中的多值属性