1

我有一个要求,我需要访问本机代码(在 android os 内)并通过 jni 接口在我的应用程序中使用它。

例如:访问HttpLiveSource.cppvoid NuPlayer::HTTPLiveSource::start() {..}中的方法 。

我从Android 中发现 - 在我自己的项目中包含原生 StageFright 功能,这可以使用两个选项:

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

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

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

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

4

1 回答 1

2

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

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

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

如何访问本机方法?

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

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

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

我是 jni 的新手

我想说,使用系统库需要的不仅仅是对 JNI 和 Android NDK 的基本了解。我强烈建议您在深入研究http://www.apress.com/9781430248279或类似书籍之前学习它。

于 2013-12-26T15:32:07.080 回答