【问题标题】:Build shared library linking to other not standard shared libarary构建链接到其他非标准共享库的共享库
【发布时间】:2012-03-20 00:49:31
【问题描述】:

我有一些两个共享库和它们的标题。 我想使用前两个库中的函数构建第三个共享库。 我认为makefile有问题。当我尝试构建时收到这个:

Android NDK:/cygdrive/d/.../jni/Android.mk:在导入路径中找不到标签为“shared1”的模块
Android NDK:您确定您的 NDK_MODULE_PATH 变量定义正确吗?
Android NDK:搜索了以下目录:
安卓 NDK:
/cygdrive/d/.../jni/Android.mk:36: *** Android NDK: 中止。 .停止。

我的项目结构:

jni/
 -我的文件.c
 - 安卓.mk
   jni/dec/
     - 大量的头文件
   jni/enc/
     - 大量的头文件
库/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)

【问题讨论】:

    标签: android c++ gcc android-ndk shared-libraries


    【解决方案1】:

    看看这个问题:Android JNI APK Packing

    您需要为libs/armeabi/文件夹指定另一个名称以避免与NDK构建冲突并在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 构建第三个共享库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2012-05-31
      • 2014-03-22
      • 1970-01-01
      相关资源
      最近更新 更多