JNI_OnLoad通常用于Android NDK吗?

时间:2017-07-20 02:09:13

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

我是Android NDK的新手,我正在Android开发者网站上阅读these tips。它建议使用JNI_OnLoad注册您的本机方法,但没有提供有关如何执行此操作的详细信息。

搜索Google's NDK sample repo on GitHub仅显示JNI_OnLoad的一次使用,并且它不会调用RegisterNatives。在网上搜索也没有太多关于如何做到这一点。

我觉得我错过了什么。据谷歌称,这应该是正确的做法,但他们自己的例子使用了"发现"方法命名方法。

这可能是一种古老的做法,那不再是真的了吗?

1 个答案:

答案 0 :(得分:3)

Android上完全支持

RegisterNatives ,正确的方法是来自 JNI_OnLoad ,这也很有效,并且是shown prominently in NDK documentation。使用 RegisterNatives 与通常通过名称匹配自动解析本机方法(总是使用 javah 来获取正确的名称)的原因很少。

  1. 当你有许多本机方法时,你可能不希望共享库中有一个庞大的导出函数表。

  2. 使用自动匹配功能可以更轻松地进行逆向工程和黑客攻击。

  3. 您可以构建自定义逻辑以在运行时匹配本机方法。

  4. @CriticalNative方法必须使用 RegisterNatives 进行注册,而不是依赖于动态JNI链接。

  5. 这些原因都不适用于操作样本和入门教程。