1. 什么是 JNI

JNI是Java Native Interface的缩写。从Java 1.1开始,JNI标准成为java平台的一部分,它允许Java和其他语言进行交互。JNI一开始为C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。关于 JNI 的用法很简单,有点像 java 里的 reflect 的工作机制。

2. Jni程序开发的一般操作步骤如下:

(1) 编写带有native声明的方法的java类

(2) 使用javac 或 IDE(JBuilder,eclipse等)编译所编写的java类

(3) 使用javah -jni java类名生成扩展名为h的头文件

(4) 使用C++ 实现本地方法,对调用签名可用 javap –s –p [类全名] 查看(开发 C++ 动态链接库本例是用的 VC6)

注意要从 JDK下面的 include 文件夹中把 jni.h和 jni_md.h 两个文件 copy 到你的 VC 工程里

(5) 在 Java 中 load 动态链接库文件,调用 native 方法.

或者说将项目依赖的所有原生库和资源加入到java项目的java.library.path,生成java程序

Android JNI 知识简介

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

1. 从如何载入.so 档案谈起

由于Android 的应用层的类都是以Java 写的,这些Java 类编译为Dex 型式的Bytecode 之后,必须靠Dalvik 虚拟机(VM: Virtual Machine) 来执行。VM 在Android 平台里,扮演很重要的角色。

此外,在执行Java 类的过程中,如果Java 类需要与C 组件沟通时,VM 就会去载入C 组件,然后让Java 的函数顺利地调用到C 组件的函数。此时,VM 扮演着桥梁的角色,让Java 与C 组件能通过标准的JNI 介面而相互沟通。

JNI 技术与 Android 应用的更多相关文章

  1. 使用jni技术进行android应用签名信息核查及敏感信息保护

           近期业余时间写了一款应用<摇啊摇>,安智.安卓.360等几个应用商店已经陆续审核通过并上线.从有想法到终于将产品做出来并公布,断断续续花了近二个半月的业余时间,整体来讲还算顺 ...

  2. 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数

    1.                 打开Eclipse,File-->New-->Project…-->Android-->AndroidApplication Projec ...

  3. 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

    原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...

  4. [转][android][利用JNI技术在Android中调用、调试C++代码]

    在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux). 没写过 ...

  5. JNI技术简介-android学习之旅(92)

    分为5步 !!!注意本地方法是java中的方法,本地函数指的是c语言中的对应函数 1.在java类中声明本地方法 2.使用javah命令,生成包含jni本地函数原型的头文件 3. 实现jni本地函数 ...

  6. 利用JNI技术在Android中调用、调试C++代码

    参考:http://blog.micro-studios.com/?p=4212 代码:http://pan.baidu.com/s/1sjukSDf

  7. JNI技术基础(2)——从零开始编写JNI代码

    书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h ...

  8. JNI技术基础(1)——从零开始编写JNI代码

    众所周知,Java程序的最大特点就是其跨平台的特性,编写的上层应用程序可以不加任何修改甚至不用重新编译而运行于不同的平台上,然而,Java本身也存着这一个弊端,那就是性能上相对要差一些,在对性能要求比 ...

  9. JNI技术概念小结

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? |-  首先,Java语言 ...

随机推荐

  1. bzoj 3672: [Noi2014]购票 树链剖分+维护凸包

    3672: [Noi2014]购票 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 480  Solved: 212[Submit][Status][D ...

  2. BZOJ 3955 Surely You Congest 解题报告

    首先,我们可以求出源为 $1$ 号点的最短路图以及各个点到 $1$ 号点的最短路. 然后我们考虑那些距离不同的点,是一定不会发生拥堵现象的. 然后我们就只需要考虑那些距离相同的点,就相当于做一个最大流 ...

  3. 关于.net那点事儿

    .NET是什么? .NET是开发“托管”软件的平台. 传统环境和.NET环境区别: 传统环境——先将源代码编译为包含机器代码的可执行文件,然后由操作系统加载和执行可执行文件. .NET环境——编译器首 ...

  4. Wp8开发环境搭建总结

    原地址:http://blog.csdn.net/lixing732100721/article/details/8564985 注意:技术发展太快  此文章年代已久  请大家酌情参照 系统要求(来自 ...

  5. POJ1177+线段树+扫描线

    思路: 以y的值进行离散化 根据x的值 对每一条y轴边进行处理,如果是"左边"则插入,是"右边"则删除. /* 扫描线+线段树+离散化 求多个矩形的周长 */ ...

  6. 编码问题 关于hibernate jdbc数据库连接在xml配置与在properties文件配置的差异

    在properties中,&字符不需要转义,因此在连接数据库的时候使用编码的地方直接使用&即可: driverClass=com.mysql.jdbc.Driver jdbcUrl=j ...

  7. 在Myeclipse buildpath 加server lib

    把eclipse下的工程复制过来后,发现缺少Server Runtime.本想直接在buildpath里加lib,在Myeclipse里找了一圈,恁是没发现在哪里可以添加,虽然在preference里 ...

  8. hadoop异常:java.lang.RuntimeException: java.lang.NoSuchMethodException

    出现异常的程序大致框架是这样的: public class getMaxTemperature extends Configured implements Tool { ... class MaxTe ...

  9. 生成Excel錯誤 遠端程序呼叫失敗。 (發生例外狀況於 HRESULT: 0x800706BE)

    错误信息:详细信息:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005.网上找到 ...

  10. BZOJ3585: mex

    3585: mex Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 322  Solved: 169[Submit][Status] Descripti ...