用到的命令
编译.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 类名 进行查看,例如