我必须使用两个本地库:一个是我自己的,另一种是第三方。 只要我用他们在不同的项目,一切正常。 但是现在我发现了Exception Ljava/lang/UnsatisfiedLinkError
。
我使用Eclipse。
我发现,如果我把现有的库在库/ armeabi,Eclipse中开始的本机代码的编译和失败。 如果我在命令行重建JNI的一部分,编译成功,但第三方库中消失。 真是愚蠢。
所以,我怎么告诉Eclipse与必须建立一个库一起使用现有的.so库? 该库是独立的。
我必须使用两个本地库:一个是我自己的,另一种是第三方。 只要我用他们在不同的项目,一切正常。 但是现在我发现了Exception Ljava/lang/UnsatisfiedLinkError
。
我使用Eclipse。
我发现,如果我把现有的库在库/ armeabi,Eclipse中开始的本机代码的编译和失败。 如果我在命令行重建JNI的一部分,编译成功,但第三方库中消失。 真是愚蠢。
所以,我怎么告诉Eclipse与必须建立一个库一起使用现有的.so库? 该库是独立的。
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建造,它会复制这个库到libs/armeabi/
构建模块,和之前你去好。
注意:这不会解决所需的标题问题。 你仍然需要添加标题的位置库到变量LOCAL_C_INCLUDES
需要它的模块中。
这是我的时刻完成的。 我不会接受(在计算器意义上的)我自己的(这个)答案beause它是不能令人满意的。
我创建了一个新的项目,并没有复制的所有java文件。 然后,我从旧的项目和第三方库到库/ armeabi复制.so库。
这是可怕的。 但是,它的工作原理。 就目前而言。 最糟糕的是,版本控制鱼雷的袭击。