【问题标题】:Android load native libraryAndroid 加载原生库
【发布时间】:2011-09-06 17:37:45
【问题描述】:

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

【问题讨论】:

    标签: android android-ndk loadlibrary


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 好的,所以我应该在打字之前尝试一下。事实证明,如果我将 /libs 文件夹放入非 NDK eclipse 项目中并将 /areabi/libSomething.so 放入其中,然后只需进行正常的 eclipse 项目构建,生成的 APK 确实有 /lib/armeabi/libSomething.so,它在清单和所有内容中,所以不太可能是这样。另一方面,在构建行中使用 -march=armv7-a 是否意味着架构文件夹应该是“/armeabi-v7a”而不是“/armeabi”?这就是我使用 ndk-build 时得到的结果。
    • 非常感谢您的回复!我在解压后浏览了 APK 并包含在内,我在 Eclipse 中没有 Android Tools->Add Native Support 选项。这是为什么?我刚刚用 Help->Check for Updates 更新了 ADT
    • 你能在模拟器上安装你的应用吗?如果是这样,请执行此操作,然后转到 Eclipse 中的 DDMS 视图,选择仿真器设备和“文件资源管理器”并查看:/data/data/your.package.name/lib。你的图书馆在吗?
    • 是的,它安装在模拟器上并位于该目录中。它被命名为 libglmove.so。我尝试调用 System.loadLibrary("glmove");并得到同样的错误
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这个问题专门针对独立编译器...如果我错了请纠正我,但我认为独立编译器没有使用 Android.mk 文件?
    • 不知道有没有。我认为除非定义了不同的 make 文件,否则编译器将使用 Android.mk 文件,但这可能只是我的一个糟糕的假设。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

      • 抱歉,但是...“如果您的应用程序需要,可以在静态块之外加载该库。”这意味着这不是必需的,无论如何我都会抛出相同的异常。
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-24
        • 1970-01-01
        • 1970-01-01
        • 2020-06-20
        相关资源
        最近更新 更多