【问题标题】:Use .so (Shared object) file in Android studio在 Android Studio 中使用 .so(共享对象)文件
【发布时间】: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 ........ 跨度>

标签: java android c++ c


【解决方案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,那么你必须按照我的答案或这个答案中的一步一步将它加载到本机端:stackoverflow.com/questions/45314478/…
  • 另一件事,你没有将你的 java 函数连接到本机函数,但是你在 java 端声明(同名,相同参数)你的 C/C++ 函数作为本机函数,然后你调用它通过JNI
猜你喜欢
  • 2012-11-16
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2015-11-24
相关资源
最近更新 更多