1、从http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html下载jdk-7u2-windows-i586.exe,安装到D:\ProgramFiles\Java,并将D:\ProgramFiles\Java\jdk1.7.0_02\bin添加到环境变量中;
2、从http://www.eclipse.org/downloads/下载eclipse-java-indigo-SR1-win32.zip并解压缩;
3、打开Eclipse,File-->new-->Java Project-->Project Name:TestJavaJNI-->next-->Finish,选中TestJavaJNI,点击右键-->new-->class-->Name:TestJNI,编写Java类:
publicclass TestJNI
{
public nativeint add(int a,int b);
public native String upperCase(String str);
static
{
System.loadLibrary("JniDll");
}
public staticvoid main(String[] args)
{
TestJNI test = new TestJNI();
int a=10, b=20, result;
result = test.add(a, b);
System.out.println("两者的和为: " + result);
String str1, str2;
str1 = "abcDEFhijk";
str2 = test.upperCase(str1);
System.out.println(str2);
}
}
4、打开命令行窗口,进入到TestJNI所在目录下,执行 javac TestJNI.java命令,编译完成后生成TestJNI.class文件;
5、执行javah TestJNI命令,生成TestJNI.h头文件;
6、打开vs2008,新建一个控制台程序,选中DLL和Empty project,将TestJNI.h复制到此工程目录下,并添加到工程中,新建一.cpp文件,包含jdk相应文件,Tools-->Options-->vc++ Directories-->include files: D:\ProgramFiles(x86)\Java\jdk1.7.0_02\include
D:\ProgramFiles(x86)\Java\jdk1.7.0_02\include\win32
#include <iostream>
#include <string>
#include "TestJNI.h"
using namespace std;
jstring str2jstring(JNIEnv*env,const char* pat)
{
//定义java String类strClass
jclassstrClass = (env)->FindClass("Ljava/lang/String;");
//获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
jmethodIDctorID = (env)->GetMethodID(strClass,"<init>","([BLjava/lang/String;)V");
//建立byte数组
jbyteArraybytes = (env)->NewByteArray(strlen(pat));
//将char*转换为byte数组
(env)->SetByteArrayRegion(bytes, 0,strlen(pat), (jbyte*)pat);
// 设置String, 保存语言类型,用于byte数组转换至String时的参数
jstringencoding = (env)->NewStringUTF("GB2312");
//将byte数组转换为java String,并输出
return (jstring)(env)->NewObject(strClass,ctorID,bytes,encoding);
}
string jstring2str(JNIEnv*env,jstringjstr)
{
char*rtn =NULL;
jclassclsstring =env->FindClass("java/lang/String");
jstringstrencode =env->NewStringUTF("GB2312");
jmethodIDmid =env->GetMethodID(clsstring,"getBytes","(Ljava/lang/String;)[B");
jbyteArraybarr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);
jsizealen =env->GetArrayLength(barr);
jbyte*ba =env->GetByteArrayElements(barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1);
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
env->ReleaseByteArrayElements(barr,ba,0);
stringstemp(rtn);
free(rtn);
returnstemp;
}
JNIEXPORTjint JNICALLJava_TestJNI_add(JNIEnv *env,jobject,jinta,jint b)
{
int result = (int)(a +b);
return (jint)result;
}
JNIEXPORTjstring JNICALLJava_TestJNI_upperCase(JNIEnv *env,jobject,jstringstr)
{
stringstrUpper;
strUpper =jstring2str(env,str);
strUpper = (string)strupr((char*)strUpper.c_str());
jstringstrResult =str2jstring(env,strUpper.c_str());
return strResult;
}
7、将生成的动态库JniDll.dll(Release or Debug)复制到TestJNI.java同一目录下,执行java TestJNI即可显示最终结果,也可以复制JniDll.dll到与src同一目录下,在Eclipse中点击Run即可,运行结果:
两者的和为: 30
ABCDEFHIJK
参考文献:
1、 http://blog.csdn.net/mingjava/article/details/180946
2、 http://www.blogjava.net/china-qd/archive/2006/04/29/44002.html
3、 http://www.189works.com/article-42158-1.html
4、 http://www.chineselinuxuniversity.net/articles/39361.shtml
5、 http://www.cnblogs.com/lichien/archive/2011/10/11/2206828.html