Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 我對android理解之jni

我對android理解之jni

編輯:關於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. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved