无法使用Android NDK与CMake构建共享库

时间:2017-01-14 17:01:50

标签: android android-studio android-ndk cmake

我从Android Studio获取了android原生活动样本,并通过我自己的原生活动实现取代了app glue实现。

所以这是我的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" />

这一切都在编译,但当我在我的设备上运行时,它会立即抛出错误:

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

我不明白,因为我从为本机活动提供的示例中复制了相同的Cmake文件,只是用我的实现替换了app glue,并为我的共享库使用了不同的名称。

以下是我使用的示例中的文件: Cmakelist.txt AndroidManifest.xml

我还需要修改其他内容吗?

1 个答案:

答案 0 :(得分:2)

经过几个小时的比较我的代码和示例代码后,我终于弄清楚出了什么问题,这是由于缺少一行代码造成的。

这个问题似乎与使用回调的本机活动实现有关,因为我不太了解发生了什么,我将链接到我发现的唯一解释: http://blog.beuc.net/posts/Make_sure_glue_isn__39__t_stripped/

因此,解决方案只是在本机活动实现中使用空函数或其他任何东西(示例代码中的app glue),并且需要通过共享库(主代码)调用它。

如果有人想详细解释,或者给这个变通办法提供更好的替代方案,那将是受欢迎的。