我有一个要求,我需要访问 native 代码(在 android 操作系统中)并通过 jni 接口(interface)在我的应用程序中使用它。
例如:在内部访问 void NuPlayer::HTTPLiveSource::start() {..}
方法
HttpLiveSource.cpp .
我从 Android - Include native StageFright features in my own project 中找到了这可以使用两个选项:
- 使用 android 完整源代码树构建您的项目。
- 你可以只复制包含文件到你的项目
我不能使用选项 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/