繁体   English   中英

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

[英]Use prebuilt JNI library in Android Studio 3.1

我获得了一个共享对象(* .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类是否将本机方法声明为private ,可以在项目中安全地将其声明为public

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

nm -D libthirdparty.so | grep Java_

如果您拥有使用它的另一个应用程序的Java代码,请在另一个调用它的库中找到Java代码。 这些功能应使用关键字native定义。 在不重命名或更改程序包的情况下接受该类,然后将其放入您的项目中。 现在,您可以通过Java本机函数定义来调用那些本机函数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM