使用Android NDK与CMake构建共享库时遇到问题

使用Android NDK与CMake构建共享库时遇到问题,android,android-studio,android-ndk,cmake,Android,Android Studio,Android Ndk,Cmake,我从androidstudio获取了android原生活动示例,并用我自己的原生活动实现替换了appglue实现 这是我的Cmake文件,它与示例中的几乎相同: cmake_minimum_required(VERSION 3.4.1) #my implementation add_library(android-impl STATIC C:/android_libs/native-impl/Activity.cpp ) # now build

我从androidstudio获取了android原生活动示例,并用我自己的原生活动实现替换了appglue实现

这是我的Cmake文件,它与示例中的几乎相同:

cmake_minimum_required(VERSION 3.4.1)

#my implementation
add_library(android-impl STATIC
            C:/android_libs/native-impl/Activity.cpp
            )

# now build app's shared lib
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

add_library(my-app SHARED
            main.cpp
            )

#add include directories

target_include_directories(my-app PRIVATE
                           C:/android_libs/native-impl/)

# add lib dependencies
target_link_libraries(my-app
                      android
                      android-impl
                      EGL
                      GLESv1_CM
                      log)
我还在Android清单文件中指定了我的共享库的名称,如下所示:

    <!-- Tell NativeActivity the name of our .so -->
    <meta-data android:name="android.app.lib_name"
        android:value="my-app" />
我不明白,因为我从为本机活动提供的示例中复制了相同的Cmake文件,只是用我的实现替换了app glue,并为我的共享库使用了不同的名称

以下是我使用的示例中的文件:


还有什么我需要修改的吗?

将我的代码与示例代码进行了几个小时的比较后,我终于找到了问题所在,这是由于缺少。。一行代码

问题似乎与使用回调的本机活动实现有关,因为我不太了解发生了什么,我将链接到我找到的唯一解释:

因此,解决方案只是在本机活动实现中有一个空函数或任何东西(在示例代码中是appglue),您需要通过共享库(即主代码)调用它


如果有人想更详细地解释,或者提供一个更好的替代方案来解决这个问题,那将是受欢迎的。

如何构建Android应用程序?如果您使用Android Studio,请确保您的.so文件位于Android Studio可以找到它并打包到.apk文件的位置。选中“是”,我正在使用android studio。我对建筑过程等不太了解。。但我没有任何。所以文件。我如何生成它?我原以为它是由cmake文件创建的。所以文件生成得很好,而Android Studio发现了它,它就是无法加载它。所以文件是在哪个文件夹中生成的(相对于Android项目根目录)?你怎么知道Android Studio找到了它?在“app\build\intermediates\transforms\stripedebugsymbol\debug\folders\2000\1f\main\lib(arm、x86等)”中,错误是“无法加载”而不是“找不到”,所以我猜它找到了,并且它与示例项目一起工作,所以我猜存在与本机活动和我的实现相关的问题,正在尝试解决它…我假设您的Activity.cpp是的修改版本。在这种情况下,您可以简单地将此文件添加到my app共享库的源列表中,并删除对android impl静态库的所有引用。我不知道为什么谷歌示例在这里使用静态库。静态库的问题是,如果链接器不理解这些部分是必需的,那么它的部分将被“优化”(从生成的共享库中删除)。
Caused by: java.lang.IllegalArgumentException: Unable to load native library: /data/app/com.nativetest.myapp-1/lib/arm/libmy-app.so

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nativetest.myapp/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app/com.nativetest.myapp-2/lib/arm/libmy-app.so