Android加载本机库

时间:2011-06-02 00:00:28

标签: android android-ndk loadlibrary

我正在尝试加载我使用独立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

5 个答案:

答案 0 :(得分:4)

您是否已检查生成的.APK文件(使用zip实用程序查看/取消存档)以查看您的库是否通过打包实现?我有点怀疑它可能没有,因为我注意到在项目和我的构建机器上的“libs”文件夹中构建的所有内容都进入了一个名为“lib”的文件夹(没有's')

如果事实证明Eclipse构建过程没有打包它不知道的任何库,我不会感到惊讶。当然,这与资源不同,资源只是因为在正确的地方而被打包。

如果您发现您的图书馆不在您的APK文件中,我认为您不能手动将其放在那里,因为它不会显示在包清单中,也会破坏任何签名。

您没有提到您的Eclipse项目是否是NDK项目(右键单击项目,Android工具 - >添加原生支持。)如果没有,我怀疑您需要将其合并为一个然后将您的库作为依赖项添加到Android.mk文件中,而不是目标。

或者:您可以尝试将您的库放入/ res在项目中,并使用System.load()而不是System.loadLibrary()来加载它。我承认我自己从来没有尝试过,所以。

答案 1 :(得分:2)

我遇到了同样的问题。我错了。

  1. 在make文件中,我将“LOCAL_SRC_FILES”拼写错误。
  2. 在c源文件中,我在方法名称
  3. 中包含了库名

    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/