【问题标题】:What's the exact significance of Android NDK platform version compared to API level?与 API 级别相比,Android NDK 平台版本的确切意义是什么?
【发布时间】:2016-09-04 11:07:30
【问题描述】:

我有一个 Android 应用,其中 minSdkVersion.apiLevel 设置为 18 targetSdkVersion.apiLevel 设置为 23。因此我将 NDK platformVersion 设置为 18。

不幸的是,在将 OpenSSL 添加到组合后,JNI 库现在无法链接:

/Users/pol/Downloads/Cross/External/Android-Libraries/openssl-1.0.2g/lib/libcrypto.a(ui_openssl.o):ui_openssl.c:function read_string_inner: error: undefined reference to 'signal'
/Users/pol/Downloads/Cross/External/Android-Libraries/openssl-1.0.2g/lib/libcrypto.a(ui_openssl.o):ui_openssl.c:function read_string_inner: error: undefined reference to 'tcsetattr'
/Users/pol/Downloads/Cross/External/Android-Libraries/openssl-1.0.2g/lib/libcrypto.a(ui_openssl.o):ui_openssl.c:function read_string_inner: error: undefined reference to 'tcsetattr'
/Users/pol/Downloads/Cross/External/Android-Libraries/openssl-1.0.2g/lib/libcrypto.a(ui_openssl.o):ui_openssl.c:function open_console: error: undefined reference to 'tcgetattr'

如果将platformVersion 设置为 21,问题就会消失(它在 19 时也不起作用)。

如果 Android 应用的 API 级别为 18,但 JNI 库的链接级别为 21,这对 Android 应用意味着什么?在运行 4.3 的设备上启动时会崩溃吗?

我无法想象 4.3 中缺少 signal 符号。这是 NDK 错误吗?

【问题讨论】:

    标签: android android-ndk openssl


    【解决方案1】:

    这正是您在 android-20 或更早版本上安装共享库时会发生的情况:它将无法加载。 signal 不见了,你不应该感到惊讶:Android 运行时从来没有打算运行像 curl 这样的命令行工具。

    【讨论】:

    • 实际上你知道是否可以弱链接这些符号以便 JNI 库在 null 也没关系。
    • 我刚刚使用提供的./Configure android-armv7 构建了 OpenSSL 以生成一个静态库,然后将其合并到 JNI 动态库中,一切正常,例如使用 OpenSSL 哈希 API 时。然而,当我开始使用RAND_bytes() 时,我得到了上面的链接错误。
    • 我意识到这是一个更好的新问题并在这里提出:stackoverflow.com/questions/37129986
    • 如果您改用setenv-android.sh,您将获得适用于您选择的 _ANDROID_API 的 OpenSSL。
    • 顺便说一句,为了结束这个循环,我最终切换到 mbedTLS,它是轻量级的纯 C 语言,可以在任何地方编译,总体上比 OpenSSL 好无数倍以满足我的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2012-02-21
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2016-02-01
    相关资源
    最近更新 更多