如何在另一个Android应用程序中调用Android ndk build .so文件?

时间:2015-11-05 05:59:27

标签: android android-ndk

我有一个要求,我必须使用Android中的.so版本构建NDK文件,我必须在我的其他Android应用程序中调用.so文件中的一些方法。

到目前为止我的尝试。

我从我的Android项目的lib文件夹中获取了.so文件并放入我应该调用该.so文件的其他应用程序li​​bs文件夹中。我使用了以下代码:

注意:我正在使用ECLIPSE

static {
        System.loadLibrary("NativeCode");
    }

并尝试使用库的完整路径

static {
        System.loadLibrary("fullpath\NativeCode");
    }

这两种情况都给出了不满意的LinkError,这意味着它没有得到.so文件的路径。

2 个答案:

答案 0 :(得分:0)

您需要将libNativeCode.so放在根目录的jni文件夹中,而不是libslib文件夹

这是一个很好的教程:http://www3.ntu.edu.sg/home/ehchua/programming/android/android_ndk.html

或者,您可以使用以下命令:

    adb shell
    $echo $PATH

它将做的是显示这样的路径:

  

/ sbin目录:/供应商/ bin中:/系统/ sbin目录:/系统/ bin中:/系统/ XBIN

您可以将.so放在/system/system/bin/system/sbin等任何文件夹中。 (请记住,但您需要手动复制它,对应用程序来说这不是一个好主意)

编辑: 您无法在应用中调用任何JNI功能,因为签名。您需要一个JNI包装器(一个.so JNI lib,它依次使用.h头文件来调用另一个库的JNI函数。这是因为JNI对签名非常敏感。所以,正如我之前建议的那样,请按照教程进行操作!

答案 1 :(得分:0)

为了使用loadLibrary()加载.so库,您必须将 libNativeCode.so 库复制到jniLibs / architecture文件夹中。

该文件夹应位于Android应用程序模块的 src / main / jniLibs / armeabi-v7a 下(假设您正在使用Android Studio)。< / p>

复制库后,将以下行添加到位于app模块文件夹的build.gradle中:

assert file("./src/main/jniLibs/armeabi-v7a/libNativeCode.so").exists()

在您完成上述步骤后,它应该正确加载lib。

如果libNativeCode.so位于错误的路径,Gradle构建将失败。

祝你好运,