使用NDK(JNI)时的应用程序设计

时间:2018-05-22 18:45:18

标签: android android-ndk java-native-interface

众所周知,我们使用NDK(或JNI)从Java代码调用本机代码。

在我看来,JNI层仅用于Java代码和本机代码之间的通信。因此,我们不应该在JNI层中放入太多代码。相反,我们可以将大部分功能(业务逻辑)放入本机代码中(例如,可以由JNI层调用的共享c库)。

但是,当我检查一些开源项目时,他们中的大多数都将所有业务逻辑放在JNI层中。这是一个好的设计吗?

相比之下,我们是否应该将JNI层设置为一个简单的包装层,并将业务逻辑放入本机代码层(例如,用于通过JNI层调用的共享库)?

总结: 有两种不同的设计:

1)Java代码 - > JNI代码(业务逻辑在这里)

2)Java代码 - > JNI代码(包装层) - >本机代码(共享库,业务逻辑在这里)

哪一个是好的设计?

我想知道使用JNI或Android NDK时的优秀设计是什么?

提前致谢!

2 个答案:

答案 0 :(得分:1)

我认为将其称为 JNI代码原生代码是正确的。你叫什么" JNI代码"与其他任何本机代码相同,它只是使用JNI库中定义的方法和类。毕竟Android Runtime本身是用C / C ++编写的,所以JNI只是它的一个接口。

现在回答你的问题。

性能考虑因素中,通常最好将逻辑与JNI分离,因为它会产生一些额外的开销。例如。如果您的字符串不应跨越本机/管理边界,则使用const char *而不是jstring会更有效。通常不会将JNI类型用于不会越过边界的变量。

设计的角度来看,通常最好将您的界面与逻辑分开定义,因为它允许轻松更改一个而不更改另一个。与您在Java中尽可能使用interface而不是class的原因相同的原则。但此外,您的代码也可以移植。

唯一可以看出将所有代码放在使用JNI的文件中是合理的情况,是非常小的本机组件,它们并不真正包含任何复杂的逻辑。就像验证许可证号或密码的简单本机功能一样。

答案 1 :(得分:0)

为了安全起见,关键魔法应该放在NDK层。