ubuntu下JNI初試

用到的命令


編譯.java文件用 javac  <XX.java>


用.c文件生成.so文件:gcc -fPIC -I <JAVAHOME>/include -I< JAVAHOME>/include/linux  -shared -o <XX.so>  <XX.c>


運行.class文件 java -Djava.library.path=. <XX> 不能加.class後綴名


注意:<>後中的內容用實際值替換

由於命令太長,可以用alias 給命令取個別名

比如我將生成.so的命令取個名字叫 c2so 則執行


下次我只要執行類似c2so libHellojni.so HelloJni.c的操作,即可生成.so文件

alias  c2so='gcc -fPIC -I /home/myfile/jdk1.6.0_23/include -I /home/myfile/jdk1.6.0_23/include/linux  -shared -o'

   /home/myfile/jdk1.6.0_23/ 爲我的jdk路徑

函數參數類型對應

具體的每一個字符的對應關係如下

字符   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"

這些東西其實也可以不用記的,需要用的時候使用命令 javap -s 類名 進行查看,例如

linux操作界面




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章