編輯:關於Android編程
這幾天rfid基本調試差不多了,是一個真正的從零到有的搭建過程,完成了很有成就感。下面主要寫一下rfid的jni
部分。
本次jni開發使用的是android的ndk工具。
jni開發,個人覺得比較重要的一塊是jni的數據結構。在開發過程中,在網上也找了很多資料。下面是比較好的jni
數據結構解釋資料:
Andoird 中使用了一種不同傳統Java JNI的方式來定義其native的函數。其中很重要的區別是Andorid使用了一種Java 和 C 函數的映射表數組,並在其中描述了函數的參數和返回值。這個數組的類型是JNINativeMethod,定義如下:
typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;
第一個變量name是Java中函數的名字。
第二個變量signature,用字符串是描述了函數的參數和返回值
第三個變量fnPtr是函數指針,指向C函數。
其中比較難以理解的是第二個參數,例如
"()V"
"(II)V"
"(Ljava/lang/String;Ljava/lang/String;)V"
實際上這些字符是與函數的參數類型一一對應的。
"()" 中的字符表示參數,後面的則代表返回值。例如"()V" 就表示void Func();
"(II)V" 表示 void Func(int, int);
具體的每一個字符的對應關系如下
字符 Java類型 C類型
V void void
Z jboolean boolean
I jint int
J jlong long
D jdouble double
F jfloat float
B jbyte byte
C jchar char
S jshort short
數組則以"["開始,用兩個字符表示
[I jintArray int[]
[F jfloatArray float[]
[B jbyteArray byte[]
[C jcharArray char[]
[S jshortArray short[]
[D jdoubleArray double[]
[J jlongArray long[]
[Z jbooleanArray boolean[]
上面的都是基本類型。如果Java函數的參數是class,則以"L"開頭,以";"結尾中間是用"/" 隔開的包及類名。而其對應的C函數名的參數則為jobject. 一個例外是String類,其對應的類為jstring
Ljava/lang/String; String jstring
Ljava/net/Socket; Socket jobject
如果JAVA函數位於一個嵌入類,則用$作為類名間的分隔符。
例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z"
有了上面的知識,你會清楚native方法和java之間的數據類型的關系。
另外一點,進行jni開發要主要的是native方法的名字:
比如你的應用app的路徑是這樣:src/com/android/rfid/Rfid.java
那麼你的native方法名應為Java_com_android_rfid_Rfid_xxx (JNIEnv* env, jobject thiz)
在java文件裡面加入:
public native short[] xxx();
static {
System.loadLibrary("rfid-jni");
}
然後就可以直接使用xxx()方法了。
上面例子中的System.loadLibrary("rfid-jni")的librfid_jni.so是ndk工具編譯出來的。關於ndk的使用網上有很
相關的資料,在這裡就不累述了。
今天的幾個目標: 1. 自定義ActionProvider 2. Toolbar ActionBar自定義Menu 3. Toolbar ActionBar 右側Menu
效果圖: 1.新建TestFragmen繼承Fragment public class TestFragment extends Fragment { pr
1.把eclipse工程配置文件復制到Android源碼根目錄下cp development/ide/eclipse/.classpath ./2.修改eclipse程序
上一篇文章介紹了MediaPlayer相關內容,這次用兩篇文章來介紹SurfaceView的用法。網上介紹SurfaceView的用法有很多,寫法也層出不同,例如繼承Su