【问题标题】:Trouble building shared lib with CMake using Android NDK使用 Android NDK 使用 CMake 构建共享库时遇到问题
【发布时间】:2017-01-14 17:01:50
【问题描述】:

我从 Android Studio 中获取了 android 原生 Activity 示例,并将应用粘合实现替换为我自己的原生 Activity 实现。

这是我的 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 文件,只是用我的实现替换了应用胶水,并为我的共享库使用了不同的名称。

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

还有什么需要修改的吗?

【问题讨论】:

  • 如何构建您的 Android 应用程序?如果您使用 Android Studio,请确保您的 .so 文件位于 Android Studio 可以找到它并打包成 .apk 文件的位置。检查stackoverflow.com/questions/24357687/…
  • 是的,我正在使用 android studio。我对构建过程等不太了解。但我没有任何 .so 文件。我如何生成它?我期待它将由 cmake 文件创建
  • .so文件生成好,Android Studio找到了,就是加载不出来。
  • 在哪个文件夹生成.so文件(相对于Android项目根目录)?你怎么知道 Android Studio 找到了它?
  • in 'app\build\intermediates\transforms\stripDebugSymbol\debug\folders\2000\1f\main\lib(arm, x86 etc..)' 错误提示“无法加载”而不是“无法加载” find' 所以我猜它找到了,它适用于示例项目,所以我猜有一个与本机活动和我的实现相关的问题,试图找出它......

标签: android android-studio android-ndk cmake


【解决方案1】:

经过数小时比较我的代码和示例代码后,我终于找出了问题所在,这是由于缺少 .. 一行代码造成的。

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

因此,解决方案就是在您的本机活动实现中包含一个空函数或其他任何内容(在示例代码中是应用粘合),并且您需要通过您的共享库、您的主代码调用它。

如果有人想更详细地解释,或者提供更好的替代方法来替代此解决方法,我们将不胜感激。

【讨论】:

  • 我假设您的 Activity.cpp 是 android_native_app_glue.c 的修改版本。在这种情况下,您只需将此文件添加到 my-app SHARED 库的源列表中,并删除对 android-impl STATIC 库的所有引用。我不知道为什么 Google 示例在这里使用静态库。静态库的问题在于,如果链接器不理解这些部分是必要的,它的部分将被“优化”(从生成的 SHARED 库中删除)。
猜你喜欢
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
相关资源
最近更新 更多