AndroidNDK开发简介NDK和SDK以及JNI有什么关系_安卓ndk是干嘛的

 我来答
猪八戒网
2023-04-26 · 百度认证:重庆猪八戒网络有限公司官方账号
猪八戒网
猪八戒网(zbj.com)创建于2006年,现已形成猪八戒网、天蓬网和线下八戒工场的“双平台+一社区”服务模式,是中国领先的人才共享平台。
向TA提问
展开全部

NDK:AndroidNDK是在SDK前面又加上了“原生”二字,即NativeDevelopmentKit,因此又被Google称为“NDK”。

NDK全称:NativeDevelopmentKit。

NDK是一系列工具的集合。

*NDK提供了一系列的工具,帮助开发者快速开发C(或C)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。

*NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

*NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

其实:

NDK就是能够方便快捷开发.so文件的工具。JNI的过程比较复杂,生成.so需要大量操作,而NDK就是简化了这个过程。

AndroidSDK:

SDK(softwaredevelopmentkit)软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。因此!AndroidSDk指的既是Android专属的软件开发工具包

JNI:

JavaNativeInterface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI是本地编程接口,它使得在Java虚拟机(VM)内部运行的Java代码能够与用其它编程语言(如C、C和汇编语言)编写的应用程序和库进行交互操作

当然一般需要进行如下操作流程:

1)编写java程序:这里以HelloWorld为例。为了实现在java代码中调用c函数printf。

代码1:

classHelloWorld{

publicnativevoid();

static{

System.loadLibrary("hello");

}

publicstaticvoidmain(String[]args){

newHelloWorld().();

}

}

声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。

Load动态库:System.loadLibrary("hello");

这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary()的参数“hello”是动态库的名字。

2)编译

javacHelloWorld.java

3)生成扩展名为h的头文件javah?

JNIEXPORTvoidJNICALLJava_HelloWorld_(JNIEnv*,jobject);

这个h文件相当于我们在java里面的接口,这里声明了一个Java_HelloWorld_(JNIEnv*,jobject)方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C程序的时候所使用的方法名必须和这里的一致)。

4)编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法

代码2:

#include"jni.h"

#include"HelloWorld.h"

#includeotherheaders

JNIEXPORTvoidJNICALLJava_HelloWorld_(JNIEnv*env,jobjectobj)

{

printf("Helloworld!/n");

return;

}

注意代码2中的第1行,需要将jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入。然后保存为.c就ok了。

5)生成动态库

这里以在Windows中为例,需要生成dll文件。在保存.c文件夹下面,使用VC的编译器cl成。cl-I%java_home%/include-I%java_home%/include/win32-LD.c-Fehello.dll注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。

另外需要将-I%java_home%/include-I%java_home%/include/win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。

微测检测5.10
2023-05-10 广告
您好!建议咨 深圳市微测检测有限公司,已建立起十余个专业实验室,企业通过微测检测就可以获得一站式的测试与认 证解决方案;(EMC、RF、MFi、BQB、QI、USB、安全、锂电池、快充、汽车电子EMC、汽车手机互 联、语音通话质量),认证遇... 点击进入详情页
本回答由微测检测5.10提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式