我正在尝试加载我使用独立NDK工具链构建的库。
我构建了libGLmove.so并将其放在Eclipse项目的libs / armeabi中
但是,对System.loadLibrary("GLmove")
的调用会引发UnsatisfiedLinkError
有关如何解决问题或让Android找到我的库的任何想法? 在构建库之后,ndk-build如何打包它?
编辑:确切的编译标志是:
/Users/thomas/Documents/android-ndk-r5b/toolchains/arm-eabi-4.4.0/prebuilt/darwin-x86/bin/arm-eabi-g++ --sysroot = / Users / thomas / Documents / android-ndk-r5b / platforms / android-8 / arch-arm -march = armv7-a -mfloat-abi = softfp -mfpu = neon -Wl, - fix-cortex-a8 -fno-exceptions -fno-rtti - nostdlib -fpic -shared -o GLmove.so -O3
答案 0 :(得分:4)
您是否已检查生成的.APK文件(使用zip实用程序查看/取消存档)以查看您的库是否通过打包实现?我有点怀疑它可能没有,因为我注意到在项目和我的构建机器上的“libs”文件夹中构建的所有内容都进入了一个名为“lib”的文件夹(没有's')
如果事实证明Eclipse构建过程没有打包它不知道的任何库,我不会感到惊讶。当然,这与资源不同,资源只是因为在正确的地方而被打包。
如果您发现您的图书馆不在您的APK文件中,我认为您不能手动将其放在那里,因为它不会显示在包清单中,也会破坏任何签名。
您没有提到您的Eclipse项目是否是NDK项目(右键单击项目,Android工具 - >添加原生支持。)如果没有,我怀疑您需要将其合并为一个然后将您的库作为依赖项添加到Android.mk文件中,而不是目标。
或者:您可以尝试将您的库放入/ res在项目中,并使用System.load()而不是System.loadLibrary()来加载它。我承认我自己从来没有尝试过,所以。
答案 1 :(得分:2)
我遇到了同样的问题。我错了。
Java_com_my_namespace_libname_activity_methodName(JNIEnv* env, jobject _this) {
//Fancy Native Junk Here
}
一旦我解决了这两件事,重新运行ndk-build并用F5刷新eclipse项目就开始工作了。
答案 2 :(得分:2)
您没有提供太多详细信息,但可能是您构建的.so
依赖于您正在使用的手机版本上没有的库。
我没有找到任何方法告诉NDK您要定位哪个Android SDK版本,所以不清楚它的这一方面应该如何工作,但看起来很容易带来从较新的SDK版本到您的.so
的依赖关系,因此它不会加载到所有手机上。
答案 3 :(得分:1)
请检查System.loadLibrary(“GLmove”)的语法和位置
System.loadLibrary调用应该在Java源文件的静态块中
static {
System.loadLibrary("nativelib");
}
http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html
答案 4 :(得分:1)
如果您的本地库需要其他库,则需要先加载它们。如果这没有帮助,请检查您的项目目录是否包含空格。
此外,您可能会发现本教程很有用:http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/