




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、分類: android 2011-06-22 13:48 251人閱讀 評(píng)論(2 收藏 舉報(bào) -作者:賴玉平(Peter Lai) 要達(dá)到的目的:android系統(tǒng)中,用JAVA寫界面程序,調(diào)用jni中間庫(kù)提供的接口,去操作某個(gè)驅(qū)動(dòng)節(jié)點(diǎn),實(shí)現(xiàn)read,writer ioctl等操作!這對(duì)底層驅(qū)動(dòng)開發(fā)人員是很重要的一個(gè)調(diào)試通道,也是android 系統(tǒng)下提供一些特殊功能接口的方法!本文前提:我們假設(shè)已經(jīng)寫了一個(gè)驅(qū)動(dòng)程序,它是控制LED的亮滅的,并且創(chuàng)建了一個(gè)節(jié)點(diǎn):/dev/vib,也就是通過open這個(gè)vib節(jié)點(diǎn)
2、,可以read/write/ioctl 操作驅(qū)動(dòng)程序?qū)崿F(xiàn)LED燈的亮滅控制,具體可以看我另一篇博文android驅(qū)動(dòng)例子(LED燈控制)開發(fā)環(huán)境 1、ubuntu下的NDK編譯環(huán)境,2、Esclips開發(fā)環(huán)境一、編寫JNI模塊當(dāng)安裝好NDK編譯環(huán)境后,會(huì)在它的目錄下找到sample目錄,它里面有一些例子,可以參考這些例子來寫我們自已的模塊。1、 source文件夾下,新建“LEDSJNI”文件夾。2、 Source/LEDSJNI/jni/目錄下,新建“vib-jni.c”vib-jni.c文件#include #include #include /*包括文件操作,如open( read( c
3、lose( write(等*/-for output the debug log message#include #define LOG_TAG "vib-jni"#define LOGI(. _android_log_print(ANDROID_LOG_INFO,LOG_TAG,_VA_ARGS_#define LOGE(. _android_log_print(ANDROID_LOG_ERROR,LOG_TAG,_VA_ARGS_#define DEVICE_NAME "/dev/vib" /device point#define VIB_ON 0x
4、11#define VIB_OFF 0x22int fd;jstringJava_com_auly_control_vibClass_stringFromJNI( JNIEnv* env,jobject thiz return (*env->NewStringUTF(env, "Hello from JNI-Peter for vib!"/打印字符串jint Java_com_auly_control_vibClass_Init( JNIEnv* env LOGE("vibClass_Init( /n"fd = open(DEVICE_NAME,O
5、_RDWR;/打開設(shè)備LOGE("vibClass_Init(-> fd = %d /n",fd;if(fd = -1LOGE("open device %s error /n ",DEVICE_NAME;/打印調(diào)試信息return 0;elsereturn 1;jint Java_com_auly_control_vibClass_IOCTLVIB( JNIEnv* env, jobject thiz, jint controlcode int CTLCODE = controlcode;LOGE("IOCTLVIB( = %x -vi
6、bClass_IOCTLVIB /n",CTLCODE;switch(CTLCODEcase VIB_ON:ioctl(fd,VIB_ON;/調(diào)用驅(qū)動(dòng)程序中的ioctrl接口,把命令VIB_ON傳下去,實(shí)現(xiàn)硬件操作break;case VIB_OFF:ioctl(fd,VIB_OFF;/調(diào)用驅(qū)動(dòng)程序中的ioctrl接口,把命令VIB_OFF傳下去,實(shí)現(xiàn)硬件操作break; default:break;return 1;3、相同目錄下的新建Android.mk如下Android.mk文件LOCAL_PATH := $(call my-dirinclude $(CLEAR_VARSLOC
7、AL_MODULE := vib-jniLOCAL_SRC_FILES := vib-jni.cLOCAL_CFLAGS := -WerrorLOCAL_LDLIBS := -llog -lGLESv2 /_android_log_print 函數(shù)include $(BUILD_SHARED_LIBRARY可以看到,主要是修改LOCAL_SRC_FILES指向源文件的名稱!還有一點(diǎn)很重要,如果要使用調(diào)試LOG 打印,也就是_android_log_print 函數(shù)。要在LOCAL_LDLIBS中添加-llog,如上面的Android.mk所示。4、編譯JNI模塊 #cd /home/works
8、pace/android-ndk-r4b/sources/LEDSJNI進(jìn)到剛才寫的JNI目錄 #ndk-build編譯JNI,編譯成功后,會(huì)在LEDSJNI文件夾下生成libs和obj兩個(gè)文件夾,并在LEDSJNI/libs/armeabi下得到目標(biāo)文件libvib-jni.so(目前LEDSJNI文件夾只有3個(gè)目錄jni,libs,obj)二、JAVA程序1、Eclipse新建工程拷貝LEDSJNI目錄到Windows下,例如C盤下。然后在它里面新建Eclipse 工程。新鍵工程后,如果出現(xiàn)如下錯(cuò)誤:ERROR: Unable to open class file C:/LEDS
9、JNI/gen/com/auly/control/R.java: No such file or directory解決方法如下:對(duì)著該工程鼠標(biāo)右鍵 bulid path configure build pathjava build pathorder and Export 把里面的android 2.1勾上,Build project,就OK了然后 Run as > Android application,就會(huì)出現(xiàn)android的模擬器了,里面跑個(gè)helloworld出來。2、加入button和文本輸出程序到上面為止代碼是ADT自動(dòng)生成的,似乎與我們一點(diǎn)關(guān)系也沒有。那我們來改
10、一下代碼,因?yàn)槲覀冋{(diào)用JNI接口是為了訪問驅(qū)動(dòng)程序操作硬件的,例如寫,讀,打開LED,關(guān)閉LED等等,由按鈕觸發(fā)的動(dòng)作。第一步是,增加兩個(gè)Button,在main.xml里描述一下:打開spanRes > layout> main.xml 文件span"1.0"/*這表示需要一個(gè)唯一的UID來作為Button的ID,它的引用名是led_on。*/android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="
11、string/LEDon">/*表示這個(gè)按鈕的文本是來源于另一個(gè)資源描述文件strings.xml里的文:字資源LEDon */"+id/led_off"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="string/LEDoff">實(shí)際代碼中,把注釋去掉,否則編譯不過的。3、加入輸出字符串資源工程 > values > strings.xml 文件修改如下&qu
12、ot;1.0" encoding="utf-8"?>"hello" >Led 控制程序 "app_name" >LEDAPP "LEDon" > 打開 LED "LEDoff" > 關(guān)閉 LED 上面的”打開LED”等資源,就是用在按鈕上顯示出來的字符串經(jīng)過上面的修改,現(xiàn)在程序界面上,已經(jīng)有如下效果了鼠標(biāo)右鍵工程名>Run as > Android application 運(yùn)行程序。4、加入按鈕對(duì)應(yīng)的動(dòng)作“打開LED”按扭:調(diào)用JNI的IOCT
13、LVIB(VIB_ON;“GL10.GL_NICEST;按鈕:調(diào)用JNI的 IOCTLVIB(VIB_OFF;操作:在* see/*定義頭文件*/* 定義變量 */public static/ Sets the current view port to the new size.static final int VIB_OFF = 0x22;vibClass mvibClass;/*定義類gl.glMatrixModepublic void onCreate(Bundle savedInstanceState super.onCreate(savedInstanceState;gl.glLoa
14、dIdentity- */ / Calculate the aspect ratio of the window聲明類*/mvibClass.Init(; /調(diào)用(float width / (float height,0.1f, 100.0f;按鈕:打開LED- */ gl.glMatrixMode(GL10.GL_MODELVIEW;/ ,就是在main.xmlgl.glLoadIdentity(;/ OpenGL docs.Fullscreen*/ mvibClass.IOCTLVIB(VIB_ON; requestWindowFeature/*-按鈕:關(guān)閉LED- */ /*聲明按鈕,
15、id main.xml里有定義*/btn2.setOnClickListener(new View.OnClickListener( Previous tutorial was all about setting up the GLSurfaceView. Be sure to read it beacuse it's a really importent one to be able to continue.*/mvibClass.IOCTLVIB(VIB_OFF;如果在保存時(shí)遇到說 save problems,無法保存,請(qǐng)先復(fù)制上面的代碼,然后,關(guān)閉To define the ve
16、rtices on android we define them as a float array that we put into a byte buffer to gain better performance. Look at the image to the right and the code below to match the vertices marked on the image to the code. Eclipse 的不穩(wěn)定造成的。 5、添加類鼠標(biāo)右鍵填參數(shù):Finish后,在-1.0f, -1.0f, 0.0f, / 1, Bottom LeftvibClass.ja
17、va修改如下/*Class for Vibrator -peter*/public class/ a float is 4 bytes, therefore we multiply the number if vertices with 4.static System.loadLibrary("vib-jni"vbb.order(ByteOrder.nativeOrder(;加載 JNI 庫(kù) */ /* 聲明 函數(shù) */ static/ Enabled the vertex buffer for writing and to be used during rendering
18、.gl.glEnableClientState(GL10.GL_VERTEX_ARRAY;/ OpenGL docs.里面的jstring Java_com_auly_control_vibClass_stringFromJNI( JNIEnv* env,jobject thiz */gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer; / OpenGL docs.When you are done with the buffer don't forget to disable it. Init(;/*初始化函數(shù),對(duì)應(yīng)于JNI里面的jint Java_com_auly_control_vibClass_Init( JNIEnv* env */public static native int IOCTLVIB(int controlcode;/*IO CTRL 接口* 對(duì)應(yīng)于JNI里的jint Java_com_auly_control_vibClass_IOCTLVIB( JNIEnv* env, jobject thiz, jint controlcode */三、 編譯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆山東省青島市三十九中學(xué)高三第一次調(diào)研測(cè)試英語(yǔ)試卷含答案
- 變電檢修工復(fù)習(xí)題(含答案)
- 江蘇省宿遷市沭陽(yáng)縣2024-2025學(xué)年高一下學(xué)期期中英語(yǔ)試題(原卷版+解析版)
- 老年人、殘疾人養(yǎng)護(hù)服務(wù)考核試卷
- 洗浴行業(yè)商業(yè)模式創(chuàng)新趨勢(shì)分析與應(yīng)用考核試卷
- 環(huán)境監(jiān)測(cè)儀器在公共安全中的應(yīng)用考核試卷
- 稀土金屬壓延加工的技術(shù)創(chuàng)新驅(qū)動(dòng)發(fā)展考核試卷
- 眼鏡行業(yè)跨界合作案例考核試卷
- 稀土金屬壓延加工的表面質(zhì)量控制技術(shù)考核試卷
- 紡織品的智能生產(chǎn)執(zhí)行系統(tǒng)實(shí)施策略考核試卷
- 2025中考(會(huì)考)地理綜合題答題模板+簡(jiǎn)答題歸納
- 真需求-打開商業(yè)世界的萬能鑰匙
- 手術(shù)室不良事件警示教育
- 有色金屬工業(yè)項(xiàng)目可行性研究報(bào)告編制原則規(guī)定(試行)
- 教練技術(shù)一階段講義
- 玻璃配合料的制備
- 貴州省建設(shè)工程安全監(jiān)督備案登記表
- 小型雕刻機(jī)結(jié)構(gòu)設(shè)計(jì)說明書
- 跨越道路和10kV線路跨越架專項(xiàng)施工方案
- 關(guān)于沒收建筑物處置的調(diào)研報(bào)告
- 萎縮性胃炎的內(nèi)鏡與病理學(xué)診斷ppt課件
評(píng)論
0/150
提交評(píng)論