JAVA JNI原理详细介绍及简单实例代码
JAVA JNI原理 JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。 有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图: 实例: 环境说明:ubuntu 10.4.2 LTS系统 程序清单1:src/com/magc/jni/HelloWorld.java /** * */ package com.magc.jni; /** * @author magc * */ public class HelloWorld { static { System.loadLibrary("Hello"); } public native void DisplayHello(); /** * @param args */ public static void main(String[] args) { new HelloWorld().DisplayHello(); } } 进入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 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_magc_jni_HelloWorld */ #ifndef _Included_com_magc_jni_HelloWorld #define _Included_com_magc_jni_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: com_magc_jni_HelloWorld * Method: DisplayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello (JNIEnv *,jobject); #ifdef __cplusplus } #endif #endif 注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。 程序清单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++文件实现了上述头文件中的函数,注意方法函数名要保持一致。 命令: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 ! 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |