發(fā)文章
發(fā)文工具
撰寫
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊(cè)
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
如何使用JNI的一些基本方法和過程在網(wǎng)上多如牛毛,,如果你對(duì)Jni不甚了解,,不知道Jni是做什么的,如何建立一個(gè)基本的jni程序,,或許可以參考下面下面這些文章:利用VC++6.0實(shí)現(xiàn)JNI的最簡單的例子 JNI入門教程之HelloWorld篇 SUN JNI Tutorial這 些資料的例子中,,大多數(shù)只是輸入一些簡單的參數(shù),獲取沒有參數(shù),。而在實(shí)際的使用過程中,,往往需要對(duì)參數(shù)進(jìn)行處理轉(zhuǎn)換。才可以被C/C++程序識(shí)別,。比如我 們?cè)贑++中有一個(gè)結(jié)構(gòu)(Struct)DiskInfo ,需要傳遞一個(gè)類似于DiskInfo *pDiskInfo的參數(shù),,類似于在C++這樣參數(shù)如何傳遞到Java中呢?下面我們就來討論C++到Java中方法的一些常見參數(shù)的轉(zhuǎn)換:
如果你習(xí)慣了使用JNI,,你就不會(huì)覺得它難了,。既然本地方法是由其他語言實(shí)現(xiàn)的,它們?cè)贘ava中沒有函數(shù)體。但是,,所有本地代碼必須用本地關(guān)鍵詞聲明,,成為Java類的成員。假設(shè)我們?cè)贑++中有這么一個(gè)結(jié)構(gòu),,它用來描述硬盤信息:
那么我們需要在Java中定義一個(gè)類來與之匹配,,聲明可以寫成這樣:
在這個(gè)類中,申明一些Native的本地方法,,來測試方法參數(shù)的傳遞,,分別定義了一些函數(shù),用來傳遞結(jié)構(gòu)或者結(jié)構(gòu)數(shù)組,,具體定義如下面代碼:
編譯生成C/C++頭文件 定義好了Java類之后,,接下來就要寫本地代碼。本地方法符號(hào)提供一個(gè)滿足約定的頭文件,,使用Java工具Javah可以很容易地創(chuàng)建它而不用手動(dòng)去創(chuàng)建,。你對(duì)Java的class文件使用javah命令,就會(huì)為你生成一個(gè)對(duì)應(yīng)的C/C++頭文件,。1,、在控制臺(tái)下進(jìn)入工作路徑,本工程路徑為:E:\work\java\workspace\JavaJni,。2,、運(yùn)行javah 命令:javah -classpath E:\work\java\workspace\JavaJni com.sundy.jnidemo ChangeMethodFromJni本文生成的C/C++頭文件名為: com_sundy_jnidemo_ChangeMethodFromJni.h 在C/C++中實(shí)現(xiàn)本地方法生成C/C++頭文件之后,你就需要寫頭文件對(duì)應(yīng)的本地方法,。注意:所有的本地方法的第一個(gè)參數(shù)都是指向JNIEnv結(jié)構(gòu)的,。這個(gè)結(jié)構(gòu)是用來調(diào)用JNI函數(shù)的。第二個(gè)參數(shù)jclass的意義,,要看方法是不是靜態(tài)的(static)或者實(shí)例(Instance)的,。前者,jclass代表一個(gè)類對(duì)象的引用,,而后者是被調(diào)用的方法所屬對(duì)象的引用,。
返回值和參數(shù)類型根據(jù)等價(jià)約定映射到本地C/C++類型,如表JNI類型映射所示,。有些類型,,在本地代碼中可直接使用,而其他類型只有通過JNI調(diào)用操作,。
表A
※ JNI類型映射
JNI通過JNIEnv提供的操作Java數(shù)組的功能。它提供了兩個(gè)函數(shù):一個(gè)是操作java的簡單型數(shù)組的,,另一個(gè)是操作對(duì)象類型數(shù)組的,。
因?yàn)樗俣鹊脑颍唵晤愋偷臄?shù)組作為指向本地類型的指針暴露給本地代碼。因此,,它們能作為常規(guī)的數(shù)組存取,。這個(gè)指針是指向?qū)嶋H的Java數(shù)組或者Java數(shù)組的拷貝的指針。另外,,數(shù)組的布置保證匹配本地類型,。
為了存取Java簡單類型的數(shù)組,你就要要使用GetXXXArrayElements函數(shù)(見表B),,XXX代表了數(shù)組的類型,。這個(gè)函數(shù)把Java數(shù)組看成參數(shù),返回一個(gè)指向?qū)?yīng)的本地類型的數(shù)組的指針,。
表B
JNI數(shù)組存取函數(shù)
當(dāng)你對(duì)數(shù)組的存取完成后,,要確保調(diào)用相應(yīng)的ReleaseXXXArrayElements函數(shù),參數(shù)是對(duì)應(yīng)Java數(shù)組和GetXXXArrayElements返回的指針,。如果必要的話,這個(gè)釋放函數(shù)會(huì)復(fù)制你做的任何變化(這樣它們就反射到j(luò)ava數(shù)組),,然后釋放所有相關(guān)的資源,。
為了使用java對(duì)象的數(shù)組,你必須使用GetObjectArrayElement函數(shù)和SetObjectArrayElement函數(shù),,分別去get,,set數(shù)組的元素。GetArrayLength函數(shù)會(huì)返回?cái)?shù)組的長度,。
JNI 提供的另外一個(gè)功能是在本地代碼中使用Java對(duì)象,。通過使用合適的JNI函數(shù),你可以創(chuàng)建Java對(duì)象,,get,、set 靜態(tài)(static)和實(shí)例(instance)的域,調(diào)用靜態(tài)(static)和實(shí)例(instance)函數(shù),。JNI通過ID識(shí)別域和方法,,一個(gè)域或 方法的ID是任何處理域和方法的函數(shù)的必須參數(shù)。
表C列出了用以得到靜態(tài)(static)和實(shí)例(instance)的域與方法的JNI函數(shù),。每個(gè)函數(shù)接受(作為參數(shù))域或方法的類,,它們的名稱,符號(hào)和它們對(duì)應(yīng)返回的jfieldID或jmethodID,。
表C
※域和方法的函數(shù)
如果你有了一個(gè)類的實(shí)例,,它就可以通過方法GetObjectClass得到,或者如果你沒有這個(gè)類的實(shí)例,,可以通過FindClass得到,。符號(hào)是從域的類型或者方法的參數(shù),返回值得到字符串,如表D所示,。
表D
※確定域和方法的符號(hào)
來自: 秋秋魯 > 《Android(2011/1~)》
0條評(píng)論
發(fā)表
請(qǐng)遵守用戶 評(píng)論公約
如何在C/C++中調(diào)用Java
/** 首先通過類的名稱獲取類的定義,,相當(dāng)于Java中的Class.forName方法 */ if (cls == 0) <error handler> jmethodID mid = (*env)...
Android 基于NDK的JNI開發(fā) C調(diào)用java和java調(diào)用C
Android 基于NDK的JNI開發(fā) C調(diào)用java和java調(diào)用CAndroid 基于NDK的JNI開發(fā) C調(diào)用java和java調(diào)用C的進(jìn)階教程收藏。首先進(jìn)入android-ndk-1.6_r1\apps復(fù)制hello-jni文件夾到app目錄下,,更改名字為你想要的...
Java本地調(diào)用JNI使用規(guī)范詳解
Java本地調(diào)用JNI使用規(guī)范詳解,。除了基本類型外,JNI還包含了很對(duì)對(duì)應(yīng)于不同Java對(duì)象的引用類型,,JNI引用類型的組織層次如下圖所示:2. 一般函數(shù)的JNI接口函數(shù)命名方式,。3. 重載函數(shù)的JNI接口函數(shù)命名方...
Java本地接口規(guī)范設(shè)計(jì)概述
Java本地接口規(guī)范設(shè)計(jì)概述 - shenbin1430的專欄 - CSDN博客Java本地接口規(guī)范設(shè)計(jì)概述 收藏 平臺(tái)相關(guān)代碼是通過調(diào)用 JNI 函數(shù)來訪問 Java 虛擬機(jī)功能的。JNI 函數(shù)可通過接口指針來獲得,。為確保程序員可...
1-android_JNI編程_一些技巧
有一點(diǎn)要補(bǔ)充的是,,本文所用到的函數(shù)調(diào)用方式都是針對(duì)C++的,如果要在C中使用,,所有的env->都要被替換成(env)->,,而且后面的函數(shù)中需要增加一個(gè)參數(shù)env,具體請(qǐng)看一下jni.h的代碼,。jfieldIDfid=e...
JNI數(shù)據(jù)類型
JNI數(shù)據(jù)類型,。它提供了兩個(gè)函數(shù):一個(gè)是操作java的簡單型數(shù)組的,,另一個(gè)是操作對(duì)象類型數(shù)組的。這個(gè)函數(shù)把Java數(shù)組看成參數(shù),,返回一個(gè)指向?qū)?yīng)的本地類型的數(shù)組的指針,。為了使用java對(duì)象的數(shù)組,你必須...
建立Android SDK下的JNI,、JAVA應(yīng)用完整步驟---Android JAVA調(diào)用C++代碼
建立Android SDK下的JNI,、JAVA應(yīng)用完整步驟---Android JAVA調(diào)用C++代碼在開發(fā)Android應(yīng)用的過程中,通常有兩種方式:NDK和eclipse,,或者直接在Android SDK增加,。
Android之ndk中JNIENV env->NewStringUTF (*env)->NewStringUTF
Android之ndk中JNIENV env->NewStringUTF (*env)->NewStringUTF.然而,在C++代碼中,,JNIEnv實(shí)際上是C++類實(shí)例,,JNI函數(shù)以成員函數(shù)形式存在,因?yàn)镴NI方法已經(jīng)訪問了當(dāng)前的JNI環(huán)境,,因此JNI方法調(diào)用不...
java中調(diào)用c(c++)寫的dll文件的實(shí)現(xiàn)及步驟(轉(zhuǎn))
本文為在 32 位 Windows 平臺(tái)上實(shí)現(xiàn) Java 本地方法提供了實(shí)用的 示例,、步驟和準(zhǔn)則。本文中的示例使用 Sun Microsystems 公司創(chuàng)建的 Java...
微信掃碼,在手機(jī)上查看選中內(nèi)容
微信掃碼,,在手機(jī)上查看選中內(nèi)容