?
簡單JNI實現程序
內容相關知識來源于網絡?
?
1. 編寫Java類代碼(JNITest.java)
?
// A simple JNI program. // author: jarg // http://jarg.iteye.com/ public class JNITest { private native int max(int[] elements); // declare the function: max. public static void main(String[] args) { int[] elements = {2,3,11,5,8,1,5,24,11,32}; System.loadLibrary("Maxdll"); // load the function in dll. // output the max one in array elements. System.out.println("The max one of elements: " + new JNITest().max(elements)); } }
?
?該Java程序用來測試,調用本地函數即動態鏈接庫(Maxdll.dll)中的函數.
private native int max(int[] elements);聲明本地函數.
System.loadLibrary("Maxdll");用于加載動態鏈接庫
new JNITest().max(elements);向本地函數傳入一個整型數組,執行本地函數max求數組中最大值的操作.
?
?
2. 編譯成字節代碼(JNITest.class)
編譯JNITest.java,生成相應的.class文件.
?
?
3. 產生C頭文件(JNITest.h)
命令中輸入javah JNITest生成JNITest.h的頭文件.
JNITest.h
?
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class JNITest */ #ifndef _Included_JNITest #define _Included_JNITest #ifdef __cplusplus extern "C" { #endif /* * Class: JNITest * Method: max * Signature: ([I)I */ JNIEXPORT jint JNICALL Java_JNITest_max (JNIEnv *, jobject, jintArray); #ifdef __cplusplus } #endif #endif
?
?頭文件jni.h位于:jdk安裝目錄\include.
另外,jni.h包含的jni_md.h位于:jdk安裝目錄\include\win32.
?
函數max(int elements)以 JNIEXPORT jint JNICALL Java_JNITest_max(JNIEnv *, jobject, jintArray);的形式在JNITest.h頭文件中被聲明,然后在JNITest.cpp程序被實現.
JNIEXPORT?說明該函數是一個被外部程序調用的函數.
jint對應于Java語言中int型,C語言中的long(因為java中int型是32位,等長于C中long型)做為返回函數類型.
?
JNICALL(__stdcall)是函數調用約定的一種,表示
1.參數從右向左壓入堆棧
2.函數被調用者修改堆棧
3.函數名(在編譯器這個層次)自動加前導的下劃線,后面緊跟一個@符號,其后緊跟著參數的尺寸
函數名Java_JNITest_max: 外部調用語言為Java,類名為JNITest,函數名為max.
命名規則是: Java_類名_方法名.
特別的,當類在一個類包(例如,com.jarg)中時,點號用下劃線代替,即為Java_com_jarg_JNITest_max.
函數參數: JNIEnv *, jobject, jintArray 其中,JNIEnv是在jni.h中定義的JNI環境,jintArray是傳入參數elements對應的類型.(jobject不太清楚
)
?
?
4. 編寫JNI實現代碼(Maxdll.cpp)
VC++ 6.0 新建->工程->Win32 Dynamic-Link Library 工程命名為Maxdll
添加一個Maxdll.cpp文件到工程.
?
// the implement of max. // author: jarg // http://jarg.iteye.com/ #include "JNITest.h" #include "stdio.h" JNIEXPORT jint JNICALL Java_JNITest_max(JNIEnv *env, jobject obj, jintArray elements) { int max; jint *result = env->GetIntArrayElements(elements,false); if (result == NULL) { return 0; } for (int i=0; i<env->GetArrayLength(elements); i++) { if(i == 0) max = result[0]; if(result[i] > max) max = result[i]; } return max;
?
?
5. 編譯成鏈接庫文件(Maxdll.dll)
?
這是max函數對應的實現,經編譯,連接后在工作空間\Debug中生成Maxdll.dll.
將其拷貝到.class文件目錄下.
?
6. 運行Java程序(JNITest.java)
運行Java程序(java JNITest),得到調用本地函數max后的結果:
The max one of elements: 32
?
這類知識網上很多.
推薦鏈接:? http://hi.baidu.com/leona_leon/blog/item/79f0090c71e022386059f388.html
http://hi.baidu.com/madrigar/blog/item/2635622755cfa504918f9d29.html
http://hi.baidu.com/madrigar/blog/item/10175d60936b0cd88db10d95.html
http://hi.baidu.com/madrigar/blog/item/cc7f242d89ef7a33349bf797.html
http://hi.baidu.com/madrigar/blog/item/4502b999895d160f6e068cee.html
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
