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

184*_*615 6 eclipse native eclipse-cdt android-ndk unsatisfiedlinkerror

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

我正在使用Eclipse.

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

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

Sam*_*een 9

NDK允许使用PREBUILT_SHARED_LIBRARY变量链接预构建的用户库.

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

mkdir -p jni/libs
cp librandom.so jni/libs
Run Code Online (Sandbox Code Playgroud)

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

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := random
LOCAL_SRC_FILES := librandom.so
include $(PREBUILT_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

您可以为每个预先构建的库创建一个部分,所有部分都放在其中jni/libs.

接下来,您只需将上述文件包含在jni/Android.mk中即可使用.在NDK文档中,建议在Android.mk结束时完成,而不是在中间:

include $(LOCAL_PATH)/libs/Android.mk
Run Code Online (Sandbox Code Playgroud)

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

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

LOCAL_SHARED_LIBRARIES := random
Run Code Online (Sandbox Code Playgroud)

然后当你进行ndk-build时,它会libs/armeabi/在构建模块之前复制这个库,你很高兴.

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