关于JNI的概念、原理,请谷歌之,这里介绍JNI的使用入门程序。
一、Java端
1.编写Java类Sample。
public class Sample {
//四种native方法,用于测试int、boolean、String和int[] public native int intMethod(int n); public native boolean booleanMethod(boolean bool); public native String stringMethod(String text); public native int intArrayMethod(int[] intArray); public static void main(String[] args) {
//加载Dll System.loadLibrary("MyDLL"); Sample sample = new Sample(); int square = sample.intMethod(5); boolean bool = sample.booleanMethod(true); String text = sample.stringMethod("JAVA"); int sum = sample.intArrayMethod(new int[] { 1, 1, 2, 3, 5, 8, 13 }); System.out.println("intMethod: " + square); System.out.println("booleanMethod: " + bool); System.out.println("stringMethod: " + text); System.out.println("intArrayMethod: " + sum); } }2. 编译Sample类,生成Sample.class。
javac Sample.java3.编译Sample类,生成用于C++的.h头文件Sample.h。
javah -jni SampleSample.h内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Sample */ #ifndef _Included_Sample #define _Included_Sample #ifdef __cplusplus extern "C" { #endif /* * Class: Sample * Method: intMethod * Signature: (I)I */ JNIEXPORT jint JNICALL Java_Sample_intMethod (JNIEnv *, jobject, jint); /* * Class: Sample * Method: booleanMethod * Signature: (Z)Z */ JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod (JNIEnv *, jobject, jboolean); /* * Class: Sample * Method: stringMethod * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_Sample_stringMethod (JNIEnv *, jobject, jstring); /* * Class: Sample * Method: intArrayMethod * Signature: ([I)I */ JNIEXPORT jint JNICALL Java_Sample_intArrayMethod (JNIEnv *, jobject, jintArray); #ifdef __cplusplus } #endif #endif二、C++端
1.在VS(笔者使用的是VS2010)新建Win32项目,名称为MyDLL(以便生成的dll文件名为MyDLL.dll),下一步选择工程为DLL,确定。
2.新建头文件Sample.h,内容为之前生成的Sample.h中的内容;或者可以导入之前生成的Sample.h。
3.新建cpp文件Sample.cpp,用于实现Sample.h文件中定义的函数。Sample.cpp内容如下:
#include "stdafx.h" /* * Class: Sample * Method: intMethod * Signature: (I)I */ JNIEXPORT jint JNICALL Java_Sample_intMethod(JNIEnv *env, jobject obj, jint num) { return num*num; } /* * Class: Sample * Method: booleanMethod * Signature: (Z)Z */ JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod(JNIEnv *env, jobject obj, jboolean boolean) { return !boolean; } /* * Class: Sample * Method: stringMethod * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_Sample_stringMethod(JNIEnv *env, jobject obj, jstring str) { const char* s = env->GetStringUTFChars(str,0); char cap[128]; strcpy(cap,s); env->ReleaseStringUTFChars(str,s); return env->NewStringUTF(strupr(cap)); } /* * Class: Sample * Method: intArrayMethod * Signature: ([I)I */ JNIEXPORT jint JNICALL Java_Sample_intArrayMethod(JNIEnv *env, jobject obj, jintArray array) { int i,sum = 0; jsize len = env->GetArrayLength(array); jint *body = env->GetIntArrayElements(array,0); for(i=0;i<len;i++) { sum += body[i]; } env->ReleaseIntArrayElements(array,body,0); return sum; }3.在stdAfx.h中添加#include “Sample.h”引用。编译生成MyDLL.dll文件。
三、调用
在命令行中执行java程序,该程序调用C++本地代码实现。
java Sample执行结果如图所示: