JAVA基础之理解JNI原理

来源:互联网 发布:一淘和淘宝联盟返利高 编辑:程序博客网 时间:2024/04/28 11:53
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:
实例:
环境说明:ubuntu 10.4.2 LTS系统
程序清单1:src/com/magc/jni/HelloWorld.java
复制代码
1 /** 2 * 3 */ 4  package com.magc.jni; 5 6  /** 7 * @author magc 8 * 9 */10  public class HelloWorld {11 12 static {13 14 System.loadLibrary("Hello");15 16 }17 18 public native void DisplayHello();19 /**20 * @param args21 */22 public static void main(String[] args) {23 24 new HelloWorld().DisplayHello();25 }26 27 }
复制代码
 进入src目录下,编译该JAVA类,
命令:javac ./com/magc/jni/HelloWorld.java
在该HelloWorld.java所在目录下生成HelloWorld.class
然后使用javah生成头文件,
命令:javah -jni com.magc.jni.HelloWorld
在当前目录下生成com_magc_jni_HelloWorld.h头文件,此文件供C、C++程序来引用并实现其中的函数
程序清单2:com_magc_jni_HelloWorld.h
复制代码
1 /* DO NOT EDIT THIS FILE - it is machine generated */ 2 #include <jni.h> 3  /* Header for class com_magc_jni_HelloWorld */ 4 5 #ifndef _Included_com_magc_jni_HelloWorld 6 #define _Included_com_magc_jni_HelloWorld 7 #ifdef __cplusplus 8 extern "C" { 9 #endif10 /*11 * Class: com_magc_jni_HelloWorld12 * Method: DisplayHello13 * Signature: ()V14 */15 JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello16 (JNIEnv *, jobject);17 18 #ifdef __cplusplus19 }20 #endif21 #endif
复制代码
注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。
     2)、此头文件中的Java_com_magc_jni_HelloWorld_DisplayHello(JNIEnv*, jobject)方法,是将来与动态链接库交互的接口,并需要名字保持一致。
 程序清单3:src/jni_helloworldImpl.cpp
复制代码
#include <jni.h>#include "com_magc_jni_HelloWorld.h"#include <stdio.h>JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello(JNIEnv *env, jobject obj){ printf("From jni_helloworldImpl.cpp :"); printf("Hello world ! \n"); return;}
复制代码
此C++文件实现了上述头文件中的函数,注意方法函数名要保持一致。
编译生成动态库libHello.so,
命令:g++ -shared -I /usr/lib/jvm/java-6-openjdk/include jni_helloworldImpl.cpp -o libHello.so
成功后,便会在当前目录下生成动态链接库libHello.so文件。
有了具体实现的动态库后,就可以运行JAVA调用JNI程序类的native方法了,
命令:java -Djava.library.path=. com.magc.jni.HelloWorld
输入结果即为:From jni_helloworldImpl.cpp :Hello world ! 
 本文参考部分内容参考:
1、http://www.iteye.com/topic/304594#814127
2、《Android应用开发详解》
 
 
转自:http://www.cnblogs.com/mandroid/archive/2011/06/15/2081093.html
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 隧道放炮声大怎么办 58工作被骗了怎么办 学历国家不承认怎么办 福州居住证一年到期怎么办 居住证过期2年怎么办 被房东坑了怎么办 房东违反了合同怎么办 上海居住证过期了怎么办 地铁卡消磁了怎么办 学生卡消磁了怎么办 家属院没房产证怎么办 邮箱收不到邮件怎么办 大学宿舍八人间怎么办 高中档案袋拆了怎么办 公派教师回国后怎么办? 事业单位辞职后档案怎么办 学信支付不了怎么办 校外怎么办北邮校园卡 报考身份证丢了怎么办 买房怎么办不取消低保 自考找不到真题怎么办 自考生考研没有档案怎么办 自考本科无学位怎么办 自考学位证书没拿到怎么办 自考毕业证出生日期错误怎么办 成考没有学位证怎么办 评职称学历认证怎么办 国家不承认学历怎么办 高考分数错了怎么办 签合同了不想干怎么办 贵港教育小学插班生怎么办 学校宿舍限瓦怎么办 苹果锁屏后wifi断开怎么办 兼职一天不给钱怎么办 五月孩子掉床怎么办 孩子五月份掉床怎么办 郑州怎么办暂住证凭条 郑州居住证凭条怎么办 宿舍虫子咬人怎么办 is语音注册频繁怎么办 苹果id注销了怎么办