如何在Android Studio中链接本地库?

5
我目前正在使用一个已编译成.so文件的库。我把这个库放到了jniLibs中,并使用以下方式进行加载:
System.loadLibrary("library");

现在,我想在我的一些本地代码中使用这个库,那么我该如何将这些 `.so` 文件与 `jni` 文件夹中的我的本地文件链接起来?

为什么不直接#include本地代码并将整个内容编译成一个大的.so文件呢? - Uriel Frankel
我不想将整个库的代码保存在我的Git存储库中。 - dragostis
1
你应该为另一个 .so 编写另一个 Android.mk,并指定可以找到 library.so 的头文件的位置。 - Blackbelt
这在Android Studio上不起作用。 - dragostis
这是我解决类似问题的方式:https://dev59.com/AGQn5IYBdhLWcg3woIYF#17131418 - mweathers
2个回答

2

现在在Android Studio中可以使用CFlags -IldFlags -L进行构建。

请参考这个好的例子


2
链接不存在,请重新上传,如果您有的话。 - dead programmer

0

通过“本地代码”,我理解您想要构建另一个使用第一个共享库的C模块。

您需要使用Android NDK本地链接系统。如果第二个模块不知道如何获取第一个模块的头文件以及共享库的存在,则无法编译第二个模块。

标准方式

第二个模块编译时需要源代码。

在第一个共享库的Android.mk中使用LOCAL_C_INCLUDESEXPORT_C_INCLUDESLOCAL_MODULE = first-module-name

在第二个模块的Android.mk中,使用LOCAL_SHARED_LIBRARIES = libfirst-module-name。不要忘记“lib”。

您的第二个模块需要知道使用第一个库的头文件路径,因此在构建时无法避免在本地拥有代码。

其他可能的解决方案:还有一个我从未使用过的$(call import-module,<tag>) [doc]

有关此页面上这些编译器标志的所有文档:http://www.kandroid.org/ndk/docs/ANDROID-MK.html

预构建方式

仅在第二个模块编译时需要.so和头文件

这在Android NDK PREBUILTS documentation.中完全描述。

第一个共享库:

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

使用第一个模块的第二个模块:

include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)

1
Android Studio 不使用 Android.mk 文件。 - dragostis
@dragostis,这里有一种方法可以在Android Studio中禁用自动化的ndk-build调用,而是使用老式的.mk文件;http://ph0b.com/android-studio-gradle-and-ndk-integration/ - harism

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接