?
簡單JNI實現(xiàn)程序
內(nèi)容相關(guān)知識來源于網(wǎng)絡(luò)?
?
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程序用來測試,調(diào)用本地函數(shù)即動態(tài)鏈接庫(Maxdll.dll)中的函數(shù).
private native int max(int[] elements);聲明本地函數(shù).
System.loadLibrary("Maxdll");用于加載動態(tài)鏈接庫
new JNITest().max(elements);向本地函數(shù)傳入一個整型數(shù)組,執(zhí)行本地函數(shù)max求數(shù)組中最大值的操作.
?
?
2. 編譯成字節(jié)代碼(JNITest.class)
編譯JNITest.java,生成相應(yīng)的.class文件.
?
?
3. 產(chǎn)生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.
?
函數(shù)max(int elements)以 JNIEXPORT jint JNICALL Java_JNITest_max(JNIEnv *, jobject, jintArray);的形式在JNITest.h頭文件中被聲明,然后在JNITest.cpp程序被實現(xiàn).
JNIEXPORT?說明該函數(shù)是一個被外部程序調(diào)用的函數(shù).
jint對應(yīng)于Java語言中int型,C語言中的long(因為java中int型是32位,等長于C中l(wèi)ong型)做為返回函數(shù)類型.
?
JNICALL(__stdcall)是函數(shù)調(diào)用約定的一種,表示
1.參數(shù)從右向左壓入堆棧
2.函數(shù)被調(diào)用者修改堆棧
3.函數(shù)名(在編譯器這個層次)自動加前導(dǎo)的下劃線,后面緊跟一個@符號,其后緊跟著參數(shù)的尺寸
函數(shù)名Java_JNITest_max: 外部調(diào)用語言為Java,類名為JNITest,函數(shù)名為max.
命名規(guī)則是: Java_類名_方法名.
特別的,當(dāng)類在一個類包(例如,com.jarg)中時,點號用下劃線代替,即為Java_com_jarg_JNITest_max.
函數(shù)參數(shù): JNIEnv *, jobject, jintArray 其中,JNIEnv是在jni.h中定義的JNI環(huán)境,jintArray是傳入?yún)?shù)elements對應(yīng)的類型.(jobject不太清楚
)
?
?
4. 編寫JNI實現(xiàn)代碼(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函數(shù)對應(yīng)的實現(xiàn),經(jīng)編譯,連接后在工作空間\Debug中生成Maxdll.dll.
將其拷貝到.class文件目錄下.
?
6. 運行Java程序(JNITest.java)
運行Java程序(java JNITest),得到調(diào)用本地函數(shù)max后的結(jié)果:
The max one of elements: 32
?
這類知識網(wǎng)上很多.
推薦鏈接:? 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
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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