java - 如何在应用程序项目中使用 android native 代码

标签 java android c++ java-native-interface native-methods

我有一个要求,我需要访问 native 代码(在 android 操作系统中)并通过 jni 接口(interface)在我的应用程序中使用它。

例如:在内部访问 void NuPlayer::HTTPLiveSource::start() {..} 方法 HttpLiveSource.cpp .

我从 Android - Include native StageFright features in my own project 中找到了这可以使用两个选项:

  1. 使用 android 完整源代码树构建您的项目。
  2. 你可以只复制包含文件到你的项目

我不能使用选项 1,所以我尝试使用选项 2...我是 jni 的新手,所以想知道:

  • 要在我的项目中包含哪些文件?
  • 如何访问本地方法?
  • 这是一种面向 future 的方法吗?(我看到源文件根据操作系统版本移动到不同的文件夹)

任何指示或详细解释都会非常有帮助。

最佳答案

要在我的项目中包含哪些文件?

这取决于您的项目。通常,您可以使用增量方法:当您的编译器提示缺少包含时,转到 Google 源并克隆其 Git 存储库的相关部分。但也可以下载完整的 AOSP 树。

请注意,在最后阶段您将需要非 NDK 共享库来链接您的 .so。最简单的方法是从目标设备的 /system/lib 中提取所有库。但如果您愿意,也可以使用模拟器。

如何访问本地方法?

您应该构建使用 JNI 与您的 Java 应用程序通信的 native 代码包装器共享库。有时,这是一个薄层,它基本上将所有底层方法以其完整的美感暴露给 Java。但最好是聚合 native 访问(毕竟,每个 JNI 遍历都有其固有的开销),并提出一个高级易于使用的 JNI 类,它将处理 native 对象、线程、你的名字-它。

这是一种面向 future 的方法吗?(我看到源文件根据操作系统版本移动到不同的文件夹)

不,它不能 100% 保证在未来工作,甚至不能在您没有明确测试的设备之一上工作。这不仅适用于 native 代码的使用,也适用于未记录的 Java API。 OTOH,将源文件移动到不同文件夹等更改(例如 4.2 左右发生的 stagefright),不一定会导致不兼容。

我是 jni 新手

我想说,使用系统库需要对 JNI 和 Android NDK 有基本的了解。我强烈建议学习http://www.apress.com/9781430248279或类似书籍,然后再深入研究。

关于java - 如何在应用程序项目中使用 android native 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20785264/

相关文章:

java - 在游戏循环中等待 FutureTask 完成

android - 访问 Android 传感器的惰性不可空属性时的空属性

c++ - 如何一致地重播事件列表

C++ lambda 不推断函数重载

java - eclipse和tomcat调试

java - SAX 解析器换行符

java - ListView 的内容不显示 - Android

java - 添加到 stringbuffer 逗号

android - 三星S4支持BLE应用吗?

c++ - 在 C++ 中是否有符合标准的方法来执行零拷贝 IPC?