我必须使用两个本机库:一个是我自己的,另一个是第三方库。只要我在单独的项目中使用它们,一切都很好。但现在我得到了Exception Ljava/lang/UnsatisfiedLinkError
.
我正在使用Eclipse。
我发现,如果我将现有的库放在libs/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-build时,它会在构建模块之前将此库复制到libs/armeabi/
中,你就可以开始了。
注意:这不能解决所需标头的问题。您仍然需要将库标头的位置添加到需要它的模块中的变量LOCAL_C_INCLUDES
中。
这就是我目前所做的。我不会接受(在堆栈溢出的意义上(我自己的(这个(答案,因为它不令人满意。
我创建了一个新项目并在那里复制了所有 java 文件。然后,我将旧项目中的 .so 库和第三方库复制到 libs/armeabi 中。
这太可怕了。但它有效。目前。最糟糕的是版本控制被鱼雷破坏了。