我必须使用两个本地库:一个是我自己的,另一个是第三方。只要我在单独的项目中使用它们,一切都很好。但现在我得到了Exception Ljava/lang/UnsatisfiedLinkError
。
我正在使用Eclipse。
我发现如果将现有库放在libs / armeabi中,Eclipse会开始编译本机代码,但它会失败。如果我从命令行重建JNI部分,编译成功但第三方库消失。真傻。
那么我如何告诉Eclipse使用现有的.so库以及必须构建的库?这些图书馆是独立的。
答案 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。
那太可怕了。但它的确有效。目前。最糟糕的是版本控制是鱼雷。