Android ndk Android NDK-如何链接C++;库与另一个C++;图书馆 我有一个C++的LIB,名为 MyLIB ,用CygWin的Android NDK R6B的NDK构建编译。生成的库文件名为libmylib.so

Android ndk Android NDK-如何链接C++;库与另一个C++;图书馆 我有一个C++的LIB,名为 MyLIB ,用CygWin的Android NDK R6B的NDK构建编译。生成的库文件名为libmylib.so,android-ndk,static-linking,Android Ndk,Static Linking,我有一个名为helloworld的简单应用程序,其中包含mylib的.hpp文件,并且必须与libmylib.so链接 我能够编译helloworld,告诉链接器查找libmylib.so。“奇怪”的事实是: libmylib.so未与libhelloworld.so合并,因此我必须手动将libmylib.so复制到目录helloworld/libs/armeabi中 在java代码中,我必须使用System.loadLibrary显式加载mylib,并且在加载helloworld库之前必须加载

我有一个名为helloworld的简单应用程序,其中包含mylib的.hpp文件,并且必须与libmylib.so链接

我能够编译helloworld,告诉链接器查找libmylib.so。“奇怪”的事实是:

  • libmylib.so未与libhelloworld.so合并,因此我必须手动将libmylib.so复制到目录helloworld/libs/armeabi中
  • 在java代码中,我必须使用System.loadLibrary显式加载mylib,并且在加载helloworld库之前必须加载mylib(即:
    System.loadLibrary(“mylib”);
    System.loadLibrary(“ndkfoo”);
    ),否则应用程序将崩溃
  • 如果我做1和2,这个应用程序就可以完美地工作(在模拟器和真实设备上都进行了测试)。我想知道如何强制链接器生成与libmylib.so合并的libhelloworld.so,以避免上面提到的1、2和3

    谢谢

    附言

    mylib的Android.mk是:

    LOCAL_PATH := $(call my-dir) 
    include $(CLEAR_VARS)
    LOCAL_MODULE    := mylib
    LOCAL_SRC_FILES := mylib.cpp 
    include $(BUILD_SHARED_LIBRARY)
    #include $(BUILD_STATIC_LIBRARY)
    
    如果我使用BUILD_SHARED_库,我会像往常一样得到libmylib.so。如果我改用BUILD\u STATIC\u库,ndk BUILD会生成no.so或.a。我真的想看看一个简单的教程,它解释了如何使用JC++编写的一个JNI应用程序(使用java + C++代码),并将它放在另一个目录中(而不是应用程序的JNI目录)。 Pss。 当我使用BUILD_STATIC_LIBRARY mylib编译时,我获得以下信息(基本上,创建的唯一文件位于dir/mylib/libs/armeabi/下,称为gdb.setup和gdbserver):


    将mylib构建为一个静态库,而不是一个共享对象(一个.so文件)。然后,在定义helloworld的Android.mk中,将静态库列为依赖项:

    LOCAL_STATIC_LIBRARIES := libmylib
    

    将mylib构建为一个静态库,而不是一个共享对象(一个.so文件)。然后,在定义helloworld的Android.mk中,将静态库列为依赖项:

    LOCAL_STATIC_LIBRARIES := libmylib
    

    注意,在您为Android.mk文件列出的内容的末尾:

    #include $(BUILD_STATIC_LIBRARY)
    
    而不是:

    include $(BUILD_STATIC_LIBRARY)
    
    后者可能是您所需要的。请注意,hash标记在“fixed”版本中被排除。我发现了这个异常,并在谷歌上搜索了一个示例android.mk文件。我点击的第一个例子是Hello World示例,与您可能正在尝试的类似。希望有帮助

    **编辑: 即使我的回答解决了你的一些问题,还是要听从努斯库勒的建议。他的回答描述了make文件如何“看到”mylib.a文件的名称。相信他,如果你用libmylib而不是mylib.a它会起作用的。我已经在为GCC编译器(如MinGW32)生成文件中完成了这项工作。
    **

    注意到,在您为Android.mk文件列出的内容的末尾,您有:

    #include $(BUILD_STATIC_LIBRARY)
    
    而不是:

    include $(BUILD_STATIC_LIBRARY)
    
    后者可能是您所需要的。请注意,hash标记在“fixed”版本中被排除。我发现了这个异常,并在谷歌上搜索了一个示例android.mk文件。我点击的第一个例子是Hello World示例,与您可能正在尝试的类似。希望有帮助

    **编辑: 即使我的回答解决了你的一些问题,还是要听从努斯库勒的建议。他的回答描述了make文件如何“看到”mylib.a文件的名称。相信他,如果你用libmylib而不是mylib.a它会起作用的。我已经在为GCC编译器(如MinGW32)生成文件中完成了这项工作。
    **

    我更新了我的帖子,展示了mylib的Android.mk。问题是,如果我在mylib的Android.mk中使用#include$(BUILD_STATIC_LIBRARY),则什么都不做(不生成.so或.a)。此外,我认为应该是LOCAL_STATIC_LIBRARIES=mylib,而不是libmylib;您将需要本地静态库中的libmylib。乍一看,你的Android.mk看起来也不错。你试过运行ndk build V=1来查看详细的输出吗?或者试过运行-B来强制重建吗?我已经更新了我的帖子来显示mylib的Android.mk。问题是,如果我在mylib的Android.mk中使用#include$(BUILD_STATIC_LIBRARY),则什么都不做(不生成.so或.a)。此外,我认为应该是LOCAL_STATIC_LIBRARIES=mylib,而不是libmylib;您将需要本地静态库中的libmylib。乍一看,你的Android.mk看起来也不错。您是否尝试过运行ndk build V=1以查看任何详细输出,或运行-B以强制重建?