如何在应用程序项目中使用android本机代码

时间:2013-12-26 12:55:38

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

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

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

我从Android - Include native StageFright features in my own project发现,使用两个选项可以实现这一点:

  1. 使用android完整源代码树构建项目。
  2. 您只需将包含文件复制到项目
  3. 即可

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

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

    任何指针或详细说明都会非常有用。

1 个答案:

答案 0 :(得分:2)

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

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

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

如何访问原生方法?

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

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

不,它不是100%保证将来可以使用,甚至不会保证您未明确测试的其中一个设备。这不仅适用于本机代码,也适用于未记录的Java API。 OTOH,更改如将源文件移动到不同的文件夹(就像在stagefright的4.2左右发生的那样),并不一定会导致不兼容。

我是jni的新手

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