在 Android Studio 中使用 .so(共享对象)文件

Posted

技术标签:

【中文标题】在 Android Studio 中使用 .so(共享对象)文件【英文标题】:Use .so (Shared object) file in Android studio 【发布时间】:2018-07-18 11:08:00 【问题描述】:

我有 *.so 文件,这不是我在我的项目中生成的。我知道这个库中有一个名为'x'的函数,我想使用这个函数,但不知道如何..

附:

我没有用于生成 *.so 文件的源文件。

【问题讨论】:

关于 lib 的重要信息 030d470 d _ZZNK2cv20CvtColorLoop_InvokerINS_10RGBA2mRGBAIhEEEclERKNS_5RangeEE25__cv_trace_location_fn279 003306b4 b _ZZNK2cv20CvtColorLoop_InvokerINS_10RGBA2mRGBAIhEEEclERKNS_5RangeEE31__cv_trace_location_extra_fn279 0030d4a4 d _ZZNK2cv20CvtColorLoop_InvokerINS_10mRGBA2RGBAIhEEEclERKNS_5RangeEE25__cv_trace_location_fn279 003306b8 b _ZZNK2cv20CvtColorLoop_InvokerINS_10mRGBA2RGBAIhEEEclERKNS_5RangeEE31__cv_trace_location_extra_fn279 0030cb8c d _ZZNK2cv20CvtColorLoop_InvokerINS_11Gray2RGB5x5EEclERKNS_5RangeEE25__cv_trace_location_fn279 0032f9ec b _ZZNK2cv20CvtColorLoop_I ........ 跨度> 【参考方案1】:

首先,您绝对需要包含函数声明的标头 (.h)。

其次,您必须创建一个包含 .so 文件的文件夹,您可以将其命名为 jniLibs 并将其放入 src/main/jniLibs,然后将 sourceSets 添加到您的 gradle 文件中,放入 android 块:

sourceSets 
        main 
            jniLibs.srcDirs = ['src/main/jniLibs']
        
    

注意: jniLibs 文件夹通常包含子文件夹,具体取决于 lib 的目标 ABI(arm64-v8a、armeabi-v7a、x86、x86_64),因此您必须了解它。

最后你必须在java端加载本地库,添加:

   /*  Load jni .so on initialization */
    static 
        System.loadLibrary("my-native-lib-name");
    

并声明您的函数以使用它,如下所示:

public static native void myFunction(String arg, int another_arg);

【讨论】:

感谢您的回答。我做了这一切,但是这里面的问题,我不知道返回 myFunction 是什么类型,接受什么样的参数。 很遗憾,如果你没有标头,那就很难做到 即使我有这个头文件,如何将我的 java 函数或 JNI 函数连接到 .so 文件中存在的这个函数?我认为在这个文件中我们有 C 或 C++ 函数,并且想要调用这个函数。 如果你有.h,那么你必须按照我的答案或这个答案中的一步一步将它加载到本机端:***.com/questions/45314478/… 另一件事,你没有将你的 java 函数连接到本机函数,但是你在 java 端声明(同名,相同参数)你的 C/C++ 函数作为本机函数,然后你调用它通过JNI

以上是关于在 Android Studio 中使用 .so(共享对象)文件的主要内容,如果未能解决你的问题,请参考以下文章

Android studio中正确引入so文件的方法

Android如何使用so文件和Android studio中导入so

android studio怎么添加.so文件?android studio加载so文件的方法

android studio so文件放在哪

android studio中so库文件夹放在哪

android studio怎么引入.so文件