最近项目中需要使用JNI,所以研究了一下,其中遇到过不少问题,总结一下,让遇到同样问题的人可以得到解决。
在C/C++中调用Java的方法一般分为五个步骤:初始化虚拟机、获取类、获取类的方法、创建类对象、调用方法和退出虚拟机。
下面写一个小程序测试一下:
Java代码:
package jni.test;
public class Demo {
public static int COUNT = 8;
public String msg;
private int[] counts;
public Demo() {
this("缺省构造函数");
}
public Demo(String msg) {
System.out.println("<init>:" + msg);
this.msg = msg;
this.counts = null;
}
public String getMessage() {
return msg;
}
public int[] getCounts() {
return counts;
}
public void setCounts(int[] counts) {
this.counts = counts;
}
public void throwExcp() throws IllegalAccessException {
throw new IllegalAccessException("exception occur.");
}
}
上面的代码很好理解,我相信你能看的懂,我就不说了。
下面是C语言代码,里面有注释,这里先不详细说明,主要先跑起来再说:
#include <stdio.h>
#include <jni.h>
#include <stdlib.h>
#include <iostream.h>
int main() {
// 定义用到的变量
int res;
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
vm_args.version;
// 设置初始化参数
options[0].optionString = "-Djava.compiler=NONE";
// classpath有多个时,用";"分隔,UNIX下以":"分割。
options[1].optionSt