【问题标题】:multiple (my and 3rd-party) native libraries in Android NDKAndroid NDK 中的多个(我的和第 3 方)本机库
【发布时间】:2012-05-08 22:23:35
【问题描述】:

我必须使用两个本地库:一个是我自己的,另一个是第 3 方的。只要我在单独的项目中使用它们,一切都很好。但现在我收到了Exception Ljava/lang/UnsatisfiedLinkError

我正在使用 Eclipse。

我发现如果我将现有库放在 libs/armeabi 中,Eclipse 会开始编译本机代码并且它会失败。如果我从命令行重建 JNI 部分,编译成功但第 3 方库消失。真傻。

那么我如何告诉 Eclipse 使用现有的 .so 库以及必须构建的库?库是独立的。

【问题讨论】:

    标签: eclipse android-ndk native eclipse-cdt unsatisfiedlinkerror


    【解决方案1】:

    NDK 允许使用 PREBUILT_SHARED_LIBRARY 变量与预构建的用户库进行链接。

    假设你需要链接的库是librandom.so,在项目文件夹的jni子文件夹下创建一个libs文件夹:

    mkdir -p jni/libs
    cp librandom.so jni/libs
    

    然后,只需创建一个jni/libs/Android.mk 文件:

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE := random
    LOCAL_SRC_FILES := librandom.so
    include $(PREBUILT_SHARED_LIBRARY)
    

    您可以为每个预建库创建一个部分,全部放在jni/libs

    接下来,您只需将上述文件包含到您的 jni/Android.mk 中即可使一切正常工作。在 NDK 文档中,建议在 Android.mk 的末尾完成此操作,而不是中间:

    include $(LOCAL_PATH)/libs/Android.mk
    

    但是,您需要在需要此库的模块之前执行此操作。

    对于链接,您需要将以下内容添加到链接到预构建库的模块部分中。

    LOCAL_SHARED_LIBRARIES := random
    

    然后,当您执行 ndk-build 时,它会在构建模块之前将此库复制到 libs/armeabi/,然后您就可以开始了。

    注意:这并不能解决所需标题的问题。您仍然需要将库标题的位置添加到需要它的模块中的变量LOCAL_C_INCLUDES 中。

    【讨论】:

    【解决方案2】:

    这就是我目前所做的。我不会接受(在 stackoverflow 意义上)我自己的(这个)答案,因为它不令人满意。

    我创建了一个新项目并在那里复制了所有 java 文件。然后,我将旧项目中的 .so 库和 3rd 方库复制到 libs/armeabi 中。

    这太可怕了。但它有效。暂时。最糟糕的是版本控制被鱼雷。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      相关资源
      最近更新 更多