tiny6410中的部分硬件(串口、led、pwm蜂鳴器、adc等) 友善作了一個硬件庫friendlyarm-hardware.so html
若是android應用程序想要訪問以上硬件時,就要使用java的JNI技術 java
一、JNI的全稱爲:Java Native Interface,java本地接口,設計目的是與C/C++實現本地交互,在java辦不到的或者使用方便的代碼段調用。 android
二、JNI的編寫步驟 windows
a、編寫帶有native聲明的方法的java類 jvm
b、使用javac命令編譯a中實現的類 ui
c、javah -jni java類名生成擴展名爲h的頭文件 spa
d、使用C/C++實現本地方法 設計
e、將d中的本地方法生成動態連接庫 code
f、OK htm
一、編寫java程序
class HelloWorld{
public native void displayHelloWorld();
static{
System.loadLibrary("hello");
}
public static void main(String[] args){
new HelloWorld().displayHelloWorld();
}
}
javac hello.java
而後javah命令
javah -jni HelloWorld
生成.h頭文件爲
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
附件:
System.loadLibrary()的使用方法彙總
當使用System.loadLibrary()調用 Dll,兩種方法:
1.設定環境變量。
好比:所編輯的Dll在目錄「D:/cppProjects/nativecode/release」內,將這個路徑複製添加到電腦的環境變量中的path變量內便可。
2.設定項目屬性。(開發推薦)
右擊項目名|選擇屬性properties|在左邊列表內選擇「Java Build Path」|在右邊選項卡用選擇「source」|點開項目名前的「+」號,選擇「Native library location」,「Edit」選擇上面「D:/cppProjects/nativecode/release」路徑。(固然若是將dll拷貝到workspace下也能夠用相對路徑。也可右擊「src」設定其properties內Native Library項。)
System.load 和 System.loadLibrary詳解
1.它們均可以用來裝載庫文件,不管是JNI庫文件仍是非JNI庫文件。在任何本地方法被調用以前必須先用這個兩個方法之一把相應的JNI庫文件裝載。
2.System.load 參數爲庫文件的絕對路徑,能夠是任意路徑。
例如你能夠這樣載入一個windows平臺下JNI庫文件:
System.load("C://Documents and Settings//TestJNI.dll");。
3. System.loadLibrary 參數爲庫文件名,不包含庫文件的擴展名。
例如你能夠這樣載入一個windows平臺下JNI庫文件
System. loadLibrary ("TestJNI");
這裏,TestJNI.dll 必須是在java.library.path這一jvm變量所指向的路徑中。
能夠經過以下方法來得到該變量的值:
System.getProperty("java.library.path");
默認狀況下,在Windows平臺下,該值包含以下位置:
1)和jre相關的一些目錄
2)程序當前目錄
3)Windows目錄
4)系統目錄(system32)
5)系統環境變量path指定目錄
4.若是你要載入的庫文件靜態連接到其它動態連接庫,例如TestJNI.dll 靜態連接到dependency.dll, 那麼你必須注意: 1)若是你選擇 System.load("C://Documents and Settings// TestJNI.dll"); 那麼即便你把dependency.dll一樣放在C://Documents and Settings//下,load仍是會由於找不到依賴的dll而失敗。由於jvm在載入TestJNI.dll會先去載入TestJNI.dll所依賴的庫文件dependency.dll,而dependency.dll並不位於java.library.path所指定的目錄下,因此jvm找不到dependency.dll。 你有兩個方法解決這個問題:一是把C://Documents and Settings//加入到java.library.path的路徑中,例如加入到系統的path中。二是先調用 System.load("C://Documents and Settings// dependency.dll"); 讓jvm先載入dependency.dll,而後再調用System.load("C://Documents and Settings// TestJNI.dll"); 2)若是你選擇 System. loadLibrary ("TestJNI"); 那麼你只要把dependency.dll放在任何java.library.path包含的路徑中便可,固然也包括和TestJNI.dll相同的目錄。