浏览 1287 次
锁定老帖子 主题: Java JNI浅析(一)
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-21
使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。 JNI(Java Native Interface)的书写步骤 * 编写带有native声明的方法的java类 * 使用javac命令编译所编写的java类 * 使用javah jni java类名生成扩展名为h的头文件 * 使用C/C++实现本地方法 * 将C/C++编写的文件生成动态连接库 编写java程序 这里以One world为例 public class StringDLL{ static { System.loadLibrary("testStringJNI"); } public native static String get(); public native static void set(String name); public static void main(String[] args){ StringDLL s = new StringDLL(); s.set("Hello world"); System.out.println(s.get()); } } 如果是静态类型方法则生成的头文件中方法的第二个参数是对java类的引用(JNIEnv *, jclass),如不是静态类型则是对对象的引用(JNIEnv *, jobject) 使用javah 生成扩展名为h的头文件 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class StringDLL */ #ifndef _Included_StringDLL #define _Included_StringDLL #ifdef __cplusplus extern "C" { #endif /* * Class: StringDLL * Method: get * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_StringDLL_get (JNIEnv *, jclass); /* * Class: StringDLL * Method: set * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_StringDLL_set (JNIEnv *, jclass, jstring); #ifdef __cplusplus } #endif #endif 使用C实现本地方法 #include "stdafx.h" #include "testStringJNI.h" #include <stdlib.h> const char * chs; jstring s; JNIEXPORT jstring JNICALL Java_StringDLL_get(JNIEnv *env, jclass cls) { /* 简单返回转换const char为jstring */ return (*env)->NewStringUTF(env,chs); } JNIEXPORT void JNICALL Java_StringDLL_set(JNIEnv *env, jclass cls, jstring s) { chs = (*env)->GetStringUTFChars(env,s,0); //java与C类型不同,需用JNI方法进行转换 } 注意,我们总是用接口指针 env 来操作 Java 对象。 使用C++实现本地方法 #include "stdafx.h" #include "testStringJNI.h" #include <stdlib.h> const char * chs; jstring s; JNIEXPORT jstring JNICALL Java_StringDLL_get(JNIEnv *env, jclass cls) { /* 简单返回转换const char为jstring */ return env->NewStringUTF(chs); } JNIEXPORT void JNICALL Java_StringDLL_set(JNIEnv *env, jclass cls, jstring s) { chs = env->GetStringUTFChars(s,0); //java与C类型不同,需用JNI方法进行转换 } 使用 C++ 后,源代码变得更为直接,且接口指针参数消失。但是,C++ 的内在 机制与 C 的完全一样。在 C++ 中,JNI 函数被定义为内联成员函数,它们将扩 展为相应的 C 对应函数。 生成DLL文件 在.NET下新建Win32 Project工程名字为“testStringJNI” 在Application Setting里Aplication type点选DLL 拷贝头文件到工程中 书写C++程序实现头文件中定义的方法(见上页) 按F7或Build -> Build Solution 我们生成DLL文件就放在工程目录下Debug文件夹里。名字就是 工程名.DLL 拷贝DLL到java文件目录下,运行java就可以看到控制台打印出“One world” 一个简单java通过JNI调用C、C++就完成了 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |