构建链接到其他非标准共享库的共享库

6
我有两个共享库和它们的头文件。我想使用前两个库中的函数来构建第三个共享库。我认为是makefile出了问题。当我尝试构建时,会收到以下错误信息:
Android NDK: /cygdrive/d/.../jni/Android.mk: Cannot find module with tag 'shared1' in import path Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined ? Android NDK: The following directories were searched: Android NDK: /cygdrive/d/.../jni/Android.mk:36: *** Android NDK: Aborting. . Stop.
我的项目结构如下:
jni/ - myfile.c - Android.mk jni/dec/ - 许多头文件 jni/enc/ - 许多头文件 libs/armeabi/ - shared1.so - shared2.so
此外,Android.mk源代码如下:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_C_INCLUDES :=   \
    $(LOCAL_PATH)/dec \
    $(LOCAL_PATH)/enc 

LOCAL_SHARED_LIBRARIES := shared1 shared2

LOCAL_MODULE    := mylib
LOCAL_SRC_FILES := myfile.c
LOCAL_LDLIBS    += -lOpenSLES
LOCAL_LDLIBS    += -llog
LOCAL_LDLIBS    += -landroid

include $(BUILD_SHARED_LIBRARY)

$(call import-module, shared1)
$(call import-module, shared2)
2个回答

5
请看这个问题:Android JNI APK Packing 为了避免与NDK构建冲突,您需要给libs/armeabi/文件夹命名,并在include $(CLEAR_VARS)语句之前添加以下代码:
include $(CLEAR_VARS)
LOCAL_MODULE:=shared1
LOCAL_SRC_FILES:=3rdparty_libs/shared1.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:=shared2
LOCAL_SRC_FILES:=3rdparty_libs/shared2.so
include $(PREBUILT_SHARED_LIBRARY)

2
据我所知,正确的方法是使用ndk-build而不是直接调用编译器。
在Android.mk中,您需要为每个要编译的静态库指定一个模块,然后指定您的共享库应该使用它。
以下是hello-jni示例项目的修改后Android.mk文件的示例:
LOCAL_PATH := $(call my-dir)

# Define vars for library that will be build statically.
include $(CLEAR_VARS)
LOCAL_MODULE := <module_name>
LOCAL_C_INCLUDES := <header_files_path>
LOCAL_SRC_FILES :=  <list_of_src_files>

# Optional compiler flags.
LOCAL_LDLIBS   = -lz -lm
LOCAL_CFLAGS   = -Wall -pedantic -std=c99 -g

include $(BUILD_STATIC_LIBRARY)

# First lib, which will be built statically.
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_STATIC_LIBRARIES := <module_name>
LOCAL_C_INCLUDES := <header_files_path>
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

如果你想要在运行 ndk-build 时控制编译哪些模块,可以创建一个 Application.mk 文件(与 Android.mk 在同一目录下),并列出所有模块,例如下面的示例:
APP_MODULES := <module_name_1> <module_name_2> ... <module_name_n>

我认为它能帮助你。

我使用NDK-build来构建第三方共享库。 - Taras Mazepa

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