【问题标题】:CANNOT LINK EXECUTABLE error. How to Add Runtime Libs to NDK Compiled CodeCANNOT LINK EXECUTABLE 错误。如何将运行时库添加到 NDK 编译代码
【发布时间】:2021-02-22 20:59:37
【问题描述】:

我有一个 c++ 应用程序,特别是一个设备驱动程序(无 gui),我为 linux 编写并使用 makefile 构建。我希望这个驱动程序能够在 android 设备(运行 android 29 的 arm64)上运行,所以我通过使用我的 makefile 中的 android NDK 独立工具链在我的 linux 机器上成功编译了驱动程序,并喜欢适当的 arm64 依赖项。

当我通过 adb shell 将代码推送到 android 并尝试运行时,出现错误:

CANNOT LINK EXECUTABLE "./gdriver": library "libudev.so.1" not found

驱动程序有一大堆类似的依赖关系,所以我有一些问题: 我在哪里放置库/头文件,以便 android 可以在运行时找到它们? 有没有办法将我编译的 NDK 可执行文件与库打包为 Android Studio 中的 apk 或类似文件? 有没有办法把它包装好让它开箱即用?

【问题讨论】:

    标签: android c++ android-studio android-ndk apk


    【解决方案1】:

    有没有办法将我编译的 NDK 可执行文件与库一起打包为 Android Studio 中的 apk 或类似文件?

    我看到以下最简单的方法:

    1. 在 AS 中创建新项目:Select a Project Template -> Native C++
    2. 重做您的 cmake 以获取可执行文件 gdriver 以编译库 libgdriver.so 代替
    3. Java_com_example_myapplication_MainActivity_stringFromJNI中的libgdriver.so调用你的入口函数(函数来自libnative-lib.so的AS模板代码)
    4. native-lib cmake 中添加链接库:
    target_link_libraries(native-lib gdriver udev)
    

    这只是一个示例,您可以根据需要实现它,例如根本不需要native-lib,但重点是重新编译您的可执行文件,如库并从 Activity 调用其入口函数(在我们的例子中是通过 JNI) .您的所有库都将成为 APK 的一部分。

    【讨论】:

      【解决方案2】:

      许多版本的 Android 不会使用不遵循 lib*.so 模式的原生库。问题可能出在您的库名称上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多