Java提供了JNI机制,用来弥补与平台无关的特性,可以使用C/C++编写本地代码生成动态连接库交由Java调用。
首先创建一个NativeHelloWorld.java文件,包含以下内容;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class NativeHelloWorld { static { System.loadLibrary( " NativeHelloWorld " ); } native void start (String s) ; public static void main (String[] args) { new NativeHelloWorld ().start( " I am loaded by Native code of c++ " ); } }
1 2 3 4 5 //打开cmd,执行javac命令 javac NativeHelloWorld.java //当前目录将生成一个NativeHelloWorld.class,继续执行javah命令 javah NativeHelloWorld //此时生成了一个名为NativeHelloWorld.h的c/c++头文件
NativeHelloWorld.h的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include "jni.h" #ifndef _Included_NativeHelloWorld #define _Included_NativeHelloWorld #ifdef __cplusplus extern " C " {#endif JNIEXPORT void JNICALL Java_NativeHelloWorld_start (JNIEnv *, jobject, jstring) ;#ifdef __cplusplus } #endif #endif
生成头文件后,就是将该头文件运用到c/c++中并实现NativeHelloWorld.h里面的方法,最后编译成动态连接库dll放入NativeHelloWorld.class同路径下。
我这里使用的是vs2008,c++语言实现,选择新建项目->visual c++ win32->win32项目->程序设置中选择DLL->完成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include " stdafx.h " #include " jni.h " #include " NativeHelloWorld.h " #include <iostream> using namespace std;JNIEXPORT void JNICALL Java_NativeHelloWorld_start (JNIEnv *env, jobject, jstring str) { const char *p=env->;GetStringUTFChars (str,false ); char c[20 ]; cout<<"请输入字符(Enter):" ; cin.getline (c,20 ); cout<<"由JAVA传入的内容是:\n" <<p <<"\nAddress:" <<&p <<"\n用户输入的是:" <<c<<"\nAddress:" <<&c; }
编译生成NativeHelloWorld.dll 把dll放入NativeHelloWorld.class相同目录下 在cmd中执行java NativeHelloWorld 看到程序运行如下:
1 2 3 4 5 6 7 F:\java>java NativeHelloWorld 请输入字符(Enter):Native Hello World 由JAVA传入的内容是: I am loaded by Native code of c++ Address:009AFC9C 用户输入的是:Native Hello World Address:009AFC80
JNI的简单运用如上!