Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2623056
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: Java

2014-05-28 10:03:18

北京|小佳
伙计们我想问一下jni和ndk到底有什么区别呢?不都是在android里调c/c++的东西,两种方式都能实现吧?
呵呵心
jni 是 java 调用 native interface 的 功能
是 java的 特性 
呵呵心
ndk 是 android 提供的 底层 开发包  
北京|小佳
是呀,但这两种方式是不是都能实现啊? 
呵呵心
说白了 就是
呵呵心
你用 ndk 做好底层接口 用jni 去调用
北京|小佳
这就明白了,等于java自己封装了一套,android也搞了一套更方便的
呵呵心 。。。。。 
呵呵心 额。 
呵呵心 不是 android的开发语言就是 java
呵呵心 jni 是 java的功能特性之一  
呵呵心 ndk 是 底层开发工具包  
呵呵心 额。。。 
北京|小佳 擦,还真复杂
北京|小佳 没搞过ndk
北京|小佳 那最终还是要靠jni去调用ndk编好的库? 
呵呵心 可能是这样 
呵呵心 我没弄过 但是可能大概是这样  
呵呵心 ndk 提供了底层的 c接口  
呵呵心 你可以用 通过ndk提供的接口 写一些功能 
呵呵心 封装成 库  
呵呵心 在用 java jni 调用 
呵呵心 就可以了 
北京|小佳 貌似是,我也没搞过。回去研究一下jni先 
呵呵心 jni 没啥研究的  
呵呵心 很简单  
呵呵心 就是调用 native 就行了 
呵呵心 特定的一个语法 
呵呵心 就完事儿 了 
北京|奔三 jni 是java与其他语言的中间层  
北京|奔三 可以当做通道用 
北京|奔三 c可以通过jni调用java的方法 
北京|奔三 java也可以通过jni调用c的方法
呵呵心 说白了 你的 jni 调用越多。。
呵呵心 可能 效率啥的会高。。。 但是针对平台移植的代码也越多 
北京|小佳 是这个意思,我是想搞明白他和ndk之间有没有什么关系 
呵呵心 我刚才还说的不明白啊 ??
北京|小佳 是清楚了,不过没点具体的啊
北京|奔三 ndk是用c实现的
呵呵心 具体就是 ndk 提供了一套 c的接口啊 
呵呵心 你可以用他提供的接口写功能啊
北京|小佳 难道二者是独立的?
北京|奔三 你的Activity一定是java的
北京|奔三 所以想把他们连起来 
呵呵心 这样吧 
呵呵心 这么说 
北京|奔三 就要用jni在中间连上
呵呵心  jni 使得 你用 ndk 成为了可能
呵呵心 如果 没有 jni ...
呵呵心 ndk 做出来的 库 你就没法调用了
北京|小佳  NDK的作用是“我们自己写本地代码”(C/C++),自己用JNI封装成Java接口
呵呵心 但是 jni 还可以做别的 
北京|小佳 这句精辟
北京|奔三 这句我感觉说的有点不对
北京|奔三 jni就是个中间层
北京|小佳 不对?
北京|小佳 是jni让ndk成为了可能?
Longbow - -
Longbow 使用JNI调用NDK
Longbow  这个不能理解??
呵呵心 ndk 也是个 sdk 
呵呵心 就和 java sdk j2me sdk 一样 
北京|小佳 基本明白了,谢谢各位
呵呵心 里面有很多底层的接口 可以用 这些接口都是 c的。。
北京|奔三 应该是jni记java跟c c++互通
上海|Bood  ndk有很多sample,研究一个简单点的就ok了
上海|Bood  有个hello-jni
上海|Bood  基本就明白是咋回事了
呵呵心 ndk应该也提供了啥 编译工具吧
北京|奔三 应该是jni让java跟c c++互通
呵呵心 这是 ndk的概念 
上海|Bood   嗯,用cygwin即可编译
北京|奔三  跟ndk没啥关系
呵呵心 jni 是 java的 一个特性
呵呵心 可以让java 调用本地的接口
呵呵心 一般的话 就是c呗。。
上海|Bood  java里面写 native 修饰符即可
呵呵心     
整个串联起来 就是  用 ndk 提供的接口 写好库 
呵呵心 用的是c 写好了。。
呵呵心 编译好了。。
北京|奔三 java里面写 native 修饰符即可

是用别的语言来实现java方法
上海|Bood c,c++都可以,写成.so文件
呵呵心 然后再在java里 用 jni 调用
北京|小佳  再通过jni调用
呵呵心 就完了
呵呵心 就是这个意思
北京|奔三  c也可以通过jni调用java的方法
北京|奔三 java里面写 native 修饰符即可

是用别的语言来实现java方法
呵呵心 既然名字叫 jni 嘛
北京|奔三 通过jni
呵呵心 就是 java native interface咯

NDK(Native Development Kit)“原生”也就是二进制

android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等

java调用这样实现就需要用JNI(Java Native Interface)

平时用的也就是google给我们封装的好的库,即便是底层实现用的不是Java,但都有统一的Java接口


而NDK的作用是“我们自己写本地代码”(C/C++),自己用JNI封装成Java接口

比如我们想做个计算,二这不是Java的强项,可以用C/C++来写实现,返回一个运算结果就行了

NDKr5已经实现了不用写一行Java代码开发程序了,只不过还是用到了虚拟机,细节被封装隐藏起来了而已


对于JNI和NDK很多Android开发初学者没有搞明白这个问题

JNI是Java调用Native机制,是Java语言自己的特性全称为 Java Native Interface,类似的还有微软.Net Framework上的p/invoke,可以让C#或Visual Basic.Net可以调用C/C++的API,所以说JNI和Android没有关系,在PC上开发Java的应用,如果运行在Windows平台使用 JNI是是经常的,比如说读写Windows的注册表。

NDK是Google公司推出的帮助Android开发者通过C/C++本地语言编写应用的开发包,包含了C/C++的头文件、库文件、说明文档和示例 代码,我们可以理解为Windows Platform SDK一样,是纯C/C++编写的,但是Android并不支持纯C/C++编写的应用,同时NDK提供的库和函数功能很有限,仅仅处理些算法效率敏感的 问题,所以Android123推荐初学者学好Java后再学习JNI。



NDK其实多了一个把.so和.apk打包的工具,这个是很重要的。

而JNI开发并没有打包,只是把.so文件放到文件系统的特定位置。

如果是做应用开发,则需要NDK工具,不然你开发的应用程序怎么给用户用呢?难道帮他重新编译文件系统?

其他至于实现,java调用本地C/C++函数,及其编写方式,我觉得JNI和NDK没有什么区别。

还有一个我个人理解,NDK开发C/C++只能能使用NDK自带的有限的头文件,而使用JNI则可以使用文件系统中带的头文件,比如utils/Log.h

而后者的资源更多,当然NDK正在努力开发中,以便支持更丰富的接口。

http://blog.csdn.net/myshapozi/article/details/7433385

阅读(1192) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~