6

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

我正在使用 Eclipse。

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

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

4

2 回答 2

9

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

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

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需要它的模块中的变量中。

于 2012-04-28T21:24:03.570 回答
3

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

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

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

于 2012-04-28T12:37:01.750 回答