NDK - 如何在另一个项目中使用生成的.so库

Oce*_*lue 43 java-native-interface android android-ndk

我已成功使用ndk .so在一个项目中构建和使用文件.我需要在另一个项目中使用这个库.我宁愿不复制源代码,只是使用库.

尝试将整个复制并粘贴libs/armeabi/libcommon.so到项目根目录不起作用,我认为因为libs/armeabi是一个android生成的路径.

那么最好的方法是什么呢?

我正在使用Eclipse-Galileo&ndk5.

gny*_*his 44

有一种更简单的方法来完成所有这些.

假设您的预建库名为"libprebuilt.so"

在新项目的项目文件夹中,您只想包含预构建的库,执行以下操作:

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

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

LOCAL_PATH := $(call my-dir)

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

然后,当你进行ndk-build时,它会将这个库复制到libs/armeabi/...这就是全部!

  • +1.谢谢.我重新回答了这个问题并看到了你的答案.在这种情况下,你如何包含.h文件?我的意思是ProjectA中的src文件包含来自ProjectB的.h文件.当我使用你的方法时,ndk-build找不到它们. (3认同)
  • @OceanBlue:只是把它放在jni /而不是jni/libprebuilt中.通常,您可以将所有.so .a文件复制到保留相同层次结构的新项目中,/ libs/armeabi和/ obj/local/armeabi.实际上,上面的android.mk只是做同样的副本. (2认同)

Oce*_*lue 20

我想出了一种方法来做到这一点,所以在这里张贴以防万一其他人遇到它.

  1. 要共享的代码(包括Java JNI包装器,本机代码,.so库)应该在一个单独的项目中.通过右键单击项目名称 - >属性 - > Android属性 - >选中"Is Library",将其转换为库项目.此项目现在无法执行,但可以被其他项目引用.

  2. 在将使用共享对象的项目中,通过右键单击项目名称 - >属性 - > Android属性 - >库/"添加",添加对Libarray项目的引用.这应该显示在上一步中创建的库项目.选择它.

现在可以在不同项目之间轻松引用.so.


Kom*_*omi 7

所有JNI(Java Native Interface)函数名称(如JNIEXPORT void JNICALL Java_com_myapp_myclass_funct)中都有一个包名.所以我想你应该在库中重命名这些funkcions重新编译它.或者也许在您的应用中将其用作外部包.