Android NDK中的多个(我的和第三方)本机库

时间:2012-04-28 11:21:45

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

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

我正在使用Eclipse。

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

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

2 个答案:

答案 0 :(得分:8)

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中。

答案 1 :(得分:3)

这就是我目前所做的。

,我不接受(在stackoverflow意义上)我自己的(这个)答案

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

那太可怕了。但它的确有效。目前。最糟糕的是版本控制是鱼雷。