Android ndk 如何在我的Java代码中部分使用Android平台本机代码

Android ndk 如何在我的Java代码中部分使用Android平台本机代码,android-ndk,Android Ndk,我需要调用一个函数,它属于用C编写的本机Android代码。我只需要一个函数,本地代码非常庞大。以最好的方式实现这一点的方法是什么?您介意透露函数的名称吗?我这样问是因为Android中的本机非文档化API可以粗略地分为三类:依赖ODM的代码、相对稳定的代码和不稳定的代码或不由系统库导出的代码 关于第一个,您别无选择,只能使用特定于设备的库。通常,您可以从一台设备上下载这样的库,而且,您的库动态链接到该系统库,可能会在其他设备上工作。典型的示例是OpenMAX系列库(请参见示例) 关于第二个问题

我需要调用一个函数,它属于用C编写的本机Android代码。我只需要一个函数,本地代码非常庞大。以最好的方式实现这一点的方法是什么?

您介意透露函数的名称吗?我这样问是因为Android中的本机非文档化API可以粗略地分为三类:依赖ODM的代码、相对稳定的代码和不稳定的代码或不由系统库导出的代码

关于第一个,您别无选择,只能使用特定于设备的库。通常,您可以从一台设备上下载这样的库,而且,您的库动态链接到该系统库,可能会在其他设备上工作。典型的示例是OpenMAX系列库(请参见示例)

关于第二个问题,纯粹主义者将下载部分源代码树并将其编译到本地共享库中,但是重用系统库的做法非常普遍(参见示例)


第三,您别无选择,只能自己重新编译AOSP代码。

谢谢Alex,我将使用的函数是ODM特定的,例如电话相关函数。通常Android会添加一个层,并让上层发送AT命令,这使得上层ODM独立。现在在我的例子中,我需要直接调用函数。代码是C语言的,我想知道如何进行。我可以完全访问整个源代码,包括我正在学习的ODM源代码。我需要从Java代码调用一个新的应用程序。因此,您的案例属于第4类:不是实现是ODM特定的,而是API是ODM特定的。在这种情况下,我强烈建议将您的库或整个应用程序作为系统构建的一部分进行构建。这样,您就可以安全地重用系统代码的任何部分,包括特定于供应商的代码。AT命令和其他直接与设备硬件交互的类似功能的最大问题是与其他进程和应用程序共享资源。通常,Android提供的服务可能会被不同的应用程序通过绑定器IPC使用。也许你也想准备这样的抽象层。我的应用程序也是构建的一部分(系统文件夹中的apk)。现在如何从那里调用C函数?我应该为整个本机代码创建一个共享库(.so),然后加载它,然后通过JNI调用这个函数……还是有更好的方法呢?正如你所说,本机代码已经全部存在了。Java应该加载定义此顶级函数的本机库,然后(通过JNI)调用此函数。您几乎没有理由将此源代码重新构建到单独的库中。也许,您需要向Java“公开”这个函数。有两个选项:要么使用JNI的
JNI\u OnLoad()
API并在那里注册函数,要么使用。