5

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

4

5 回答 5

4

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

如果事实证明 Eclipse 构建过程没有打包它不知道的任何库,我不会感到太惊讶。当然,这与资源发生的情况不同,资源只是由于位于正确的位置而被打包。

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

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

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

于 2011-06-09T15:57:14.413 回答
2

我遇到了同样的问题。我做错的事情。

  1. 在制作文件中,我的“LOCAL_SRC_FILES”拼写错误。
  2. 在 c 源文件中,我在方法名称中有库名称

Java_com_my_namespace_libname_activity_methodName(JNIEnv* env, jobject _this) {
//Fancy Native Junk Here
}

一旦我修复了这两个问题,重新运行 ndk-build 并用 F5 刷新 eclipse 项目,它就开始工作了。

于 2011-06-02T21:09:28.287 回答
2

您没有提供太多详细信息,但可能是.so您构建的库依赖于您正在使用的手机版本不可用的库。

我还没有找到任何方法来告诉 NDK 你的目标是哪个 Android SDK 版本,所以对它的这一面应该如何工作没有任何非常清楚的想法,但看起来很容易引入依赖项从较新的 SDK 版本到您的.so,因此它不会在所有手机上加载。

于 2011-06-04T15:02:24.257 回答
1

您能否检查一下 System.loadLibrary("GLmove") 的语法和位置

System.loadLibrary 调用应该在 Java 源文件的静态块中

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

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html

于 2011-06-02T05:55:19.583 回答
1

如果您的本机库需要其他库,您需要先加载它们。如果这没有帮助,请检查您的项目目录是否包含空格。

此外,您可能会发现本教程很有帮助: http: //mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/

于 2011-06-09T18:54:37.073 回答