【问题标题】:JNI with android?JNI 与安卓?
【发布时间】:2011-05-18 09:36:05
【问题描述】:

大家好! 我最近一直在研究 C++ 应用程序,它必须在 Android 2.1 和 2.2 上运行。 所以我想知道我是否有完整的 c++ 应用程序,我可以把它放到 *.so 文件中,然后创建 android 项目,只需使用 System.loadLibrary(blalba.so) 加载这个库; 它会工作吗?

【问题讨论】:

    标签: android c++ eclipse java-native-interface android-ndk


    【解决方案1】:

    是的,您必须重新编译所有专门针对 Android 的本机库。是的,您确实需要您计划使用的所有 3rd 方本机库的源代码,因为通常当我们在 Android 外部编译和链接这些库时,它们会链接到 glibc,但不幸的是,由于许可和性能问题,Android 不使用 glibc。 Android 使用称为 libc 的 glibc 淡化版本。对于大多数常用功能,它具有与 glibc 匹配的符号名称。但据我所知,libc 没有一些与字符串相关的功能,而且它肯定没有一些 posix 支持。如果您的本机库正在使用任何已弃用的功能,您将必须通过使用 libc 支持的替代功能并相应地对您的库进行编码来找到解决方法。

    此外,正如您正确指出的那样,您必须使用 NDK 将 Java(Android 应用程序/fwk)连接到本地世界(C++)。

    虽然这听起来很简单,但根据我在 Android 上编译原生库(Android 移植)的经验,传统上这非常耗时,而且无法保证成功。

    【讨论】:

    • 非常感谢您的评论,这真的很有帮助。顺便说一句,Android 编码是否有一些特定的代码,特别是 2.1 和 2.2,或者它可能只是普通的 C++ 和 java 代码?
    • @user747228:Android 有一个 3 层架构,其中最底层是原生的(C/C++),一个 Jni 层(称为 App Fwk)位于其之上,而基于 Java 的应用程序位于其之上App Fwk 的顶部。 C、C++ 代码与 Android libc 相关联,因此它必须符合它(我记得的细节有所不同)。关于,App Fwk 和 App,它们使用 Android SDK 公开的功能,这或多或少是核心 java,但 Android 拒绝说它是 Java。
    • @user747228:如果您确实发现答案和评论有用,请不要忘记将它们标记为已接受的答案:)
    • 要添加到上述内容,您还必须为您希望支持的每个平台进行编译,打包所有 .so 并在运行时加载适当的。当 Android 基本上只支持 ARM 时,这不是问题。然而,这些天来,有基于英特尔的设备在野外(可能还有其他设备)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2019-07-06
    • 1970-01-01
    相关资源
    最近更新 更多