windows7下,Java中利用JNI调用c++生成的动态库的使用步骤
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;
??? jclass??clsstring?? =??env->FindClass("java/lang/String");
??? jstring??strencode?? =??env->NewStringUTF("GB2312");
??? jmethodID??mid?? =??env->GetMethodID(clsstring,??"getBytes",??"(Ljava/lang/String;)[B");
??? jbyteArray??barr=?? (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);
??? jsize??alen?? =??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);???
?
??? return??stemp;??
}
?
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
總結
以上是生活随笔為你收集整理的windows7下,Java中利用JNI调用c++生成的动态库的使用步骤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下遍历文件夹的实现
- 下一篇: Ubuntu下,Java中利用JNI调用