用到的命令
編譯.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 類名 進行查看,例如