我有一个要求,我必须使用Android中的.so
版本构建NDK
文件,我必须在我的其他Android应用程序中调用.so
文件中的一些方法。
到目前为止我的尝试。
我从我的Android项目的lib文件夹中获取了.so文件并放入我应该调用该.so文件的其他应用程序libs文件夹中。我使用了以下代码:
注意:我正在使用ECLIPSE
static {
System.loadLibrary("NativeCode");
}
并尝试使用库的完整路径
static {
System.loadLibrary("fullpath\NativeCode");
}
这两种情况都给出了不满意的LinkError,这意味着它没有得到.so
文件的路径。
答案 0 :(得分:0)
您需要将libNativeCode.so
放在根目录的jni
文件夹中,而不是libs
或lib
文件夹
这是一个很好的教程: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构建将失败。
祝你好运,