Android通過JNI實現與C語言的串口通訊操作藍芽硬體模組

來源:互聯網
上載者:User

標籤:android

一直想寫一份技術文檔,但由於自感能力有限而無從下筆,最近做了個關於Android平台下實現與C語言的通訊來操作藍芽模組的項目,中間碰到了許多問題,也在網上查了許多資料,在完成主要功能後,也有一些人在網上問我一些問題,這裡寫下這篇文檔算是一個階段性的總結。如果反響好,後續將會發上Android Stub與新版Android HAL的學習文檔。

由於藍芽模組是串口通訊機制,使用C語言來訪問,而Android的應用程式層採用Java,無法直接操作硬體。故使用JNI的技術實現主要功能。Android的JNI應該屬於Android HAL的一部分,由於Android的HAL機制目前還沒完全摸索透,所以這裡的程式架構算是老版本的HAL機制。程式架構如。

一、 什麼是JNI?

JNI是Java Native Interface的縮寫,中文為JAVA本地調用。從Java1.1開始,Java Native Interface(JNI)標準成為java平台的一部分,它允許Java代碼和其他語言寫的代碼進行互動。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它並不妨礙你使用其他語言,只要呼叫慣例受支援就可以了。(以上內容摘自百度百科)

二、 如何使用JNI?

1、在使用JNI之前,你要確保你的電腦中安裝以下軟體環境:

Android SDK :版本與你硬體測試環境版本相同,在Google的Android官網下載

Android NDK :用於編譯C檔案為.so的共用庫,如果你是在Linux下進行開發而又具有Android的完全SDK,則不需要

Cygwin :用於編譯C檔案

Android 開發環境 :android開發環境的配置網上一大堆,這裡不再贅述

2、程式中由於只用到Java調C,而不需要C調Java,所以在應用程式層調C的函數很簡單,只需要在一個方法前加入native關鍵字(native的方法不能有方法體),然後將編譯的共用庫匯入即可。

如下:

public class BluetoothJNI {

static{

System.loadLibrary("jni");

}

public native static int bluetoothOn(String strAT);

public native static void bluetoothOff(String strAT);

public native static String readSerial();

public native static void write(String strAT);

}

 

3、Eclipse在儲存工程後,會自動把Java檔案編譯為class檔案,我們使用javah命令把class檔案編譯成C標頭檔。如下:

 

執行此命令後將會在工程的bin目錄下產生一個.h的C標頭檔。標頭檔中會產生對應Java native方法的函式宣告。建立一個與標頭檔同名的C檔案並實現所有函數。

 

4、由於Android的底層是基於Linux核心,所以一些Windows下的系統函數不可用,Linux下的串口通訊文章網上有很多,此處代碼繁多,就不貼出來了。,我們在C檔案中引入jni.h與剛產生的標頭檔以確保JNI能調用。注意:整個程式的核心部分便是在此處,C語言與藍芽模組的串口通訊處,我在此處碰到的問題也是最多的。

三、編譯C檔案

1、在Android-ndk-r5b\samples\下建立目錄Bluetooth\jni,將C檔案與標頭檔複製過來,建立Makefile。如下:

LOCAL_PATH := $(call my-dir)

 

include $(CLEAR_VARS)

 

LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)

LOCAL_LDLIBS := -lm -llog

 

LOCAL_MODULE    := jni

LOCAL_SRC_FILES := com_android_semisky_bluetooth_util_BluetoothJNI.c

 

include $(BUILD_SHARED_LIBRARY)

2、開啟Cygwin bash shell,進入Bluetooth目錄,執行ndk-build進行編譯。

 

3、將libs/armeabi下產生的libjni.so檔案拷入到Android工程的libs/armeabi目錄下。安裝apk到開發板,執行程式。

四、可能出現的問題

1、串口讀寫權限的問題

網上的方法是在Java中擷取su帳號來改許可權或者在init.rc中添加命令來修改許可權最後編譯成img燒錄進開發板,而這兩種方法我都沒成功,最後沒辦法在dos下執行shell命令來修改

2、C檔案的串口讀寫問題

我不知道是我的程式有問題還是藍芽模組的問題,在藍芽模組返回資料稍大的時候,會出現資料有時返回有時不返回的情況。

3、亂碼問題

藍芽返回的資料時而出現亂碼,未解決。

4、串口號的問題

如果你open的時候返回的fd小於1,確保你的開發板串口號是否正確,協議是否正確,許可權是否修改。

5、最大大大的問題

讀取串口程式碼片段的演算法問題,最佳化問題,不然資料會返回不正常。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.