JNI就是Java Native Interface, 即可以实现Java调用本地库, 也可以实现C/C++调用Java代码, 从而实现了两种语言的互通, 可以让我们更加灵活的使用.通过使用JNI可以从一个侧面了解Java内部的一些实现.
本文使用的环境是
64位的win7系统
JDK 1.6.0u30 (32位)
C/C++编译器是 Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 (VC 6.0的, 其他版本的也可以编译通过, 测试过vs2010)
本文使用到的一些功能:
创建虚拟机
寻找class对象, 创建对象
调用静态方法和成员方法
获取成员属性, 修改成员属性
C/C++调用Java代码的一般步骤:
编写Java代码, 并编译
编写C/C++代码
配置lib进行编译, 配置PATH添加相应的dll或so并运行
1.编写Java代码并编译
这段代码非常简单, 有个静态方法和成员方法, 一个public的成员变量
public classSample2 {publicString name;public staticString sayHello(String name) {return "Hello, " + name + "!";
}publicString sayHello() {return "Hello, " + name + "!";
}
}
由于没有定义构造函数, 所以会有一个默认的构造函数.
运行下面的命令编译
>javac Sample2.java
可以在当前目录下看到Sample2.class文件, 编译成功, 第一步完成了, So easy!
2.查看Sample2类中的签名
>javap -s -private Sample2
结果如下
Compiled from "Sample2.java"
public classSample2 extends java.lang.Object{publicjava.lang.String name;
Signature: Ljava/lang/String;publicSample2();
Signature: ()Vpublic staticjava.lang.String sayHello(java.lang.String);
Signature: (Ljava/lang/String;)Ljava/lang/String;publicjava.lang.String sayHello();
Signature: ()Ljava/lang/String;
}
//调用默认构造函数
obj = (*env)->AllocObjdect(env, cls);
构造函数也是方法, 类似调用方法的方式.//调用指定的构造函数, 构造函数的名字叫做
mid = (*env)->GetMethodID(env, cls, "", "()V");
obj= (*env)->NewObject(env, cls, mid);
3.调用方法和修改属性
关于方法和属性是有两个ID与之对应, 这两个ID用来标识方法和属性.
jmethodID mid;