大家都知道com组件的接口方法是基于windows下开发的。要在java里调的话。就要用到JNI技术。JNI是Java Native Interface的缩写,JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。尤其是c++或是c写的com组件接口。
JNI(Java Native Interface)的书写步骤 一般分为以下:
1、 编写带有native声明的方法的java类
2、 使用javac命令编译所编写的java类
3、 使用javah ?jni java类名生成扩展名为h的头文件
4、 使用C/C++实现本地方法
5、 将C/C++编写的文件生成动态连接库
写个例子来说明,最常用的还是hello world 的例子吧。
class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
注意:LoadLibrary中的DLL文件名称可以随便定.只要做好的动态链接库改名成这个字符串就可以了
如果你想将一个方法声明为本地方法的话,必须将方法声明为native方法,并且不能实现。 做好该步准备以后,用javac TestNative.java生成.class.检验语法. 语法检查通过以后,用javah HelloWorld 生成.h的C头文件. 然后打开VC++6.0,新建->; 工程 ->; win32 Dynamic-Link Library .在向导中选择空工程. 把刚才javah生成的那个头文件加入工程 .然后 文件->;新建->;textFile 自己做一个.c文件.实现自己的native函数.例子如下:
1 #include
2 #include "HelloWorld.h"
3 #include
4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}
备注:
其中的HelloWorld.h通常在 jdk\include\ 可以先拷贝到VC安装目录下的include目录下。一劳永逸,以后可以方便使用JNI技术,全编译一下工程,如果没有出错,则此时生成动态链接库成成功。把动态链接库拷贝到HelloWorld .java所在的目录上.
运行java HelloWorld 看结果吧.
在实际应用中比较麻烦是数据类型的转换。因为要解决java和C++数据类型互通的问题。比如java里的string 如何映射为c++里相应的字符。还希望大家一起讨论。
JNI(Java Native Interface)的书写步骤 一般分为以下:
1、 编写带有native声明的方法的java类
2、 使用javac命令编译所编写的java类
3、 使用javah ?jni java类名生成扩展名为h的头文件
4、 使用C/C++实现本地方法
5、 将C/C++编写的文件生成动态连接库
写个例子来说明,最常用的还是hello world 的例子吧。
class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
注意:LoadLibrary中的DLL文件名称可以随便定.只要做好的动态链接库改名成这个字符串就可以了
如果你想将一个方法声明为本地方法的话,必须将方法声明为native方法,并且不能实现。 做好该步准备以后,用javac TestNative.java生成.class.检验语法. 语法检查通过以后,用javah HelloWorld 生成.h的C头文件. 然后打开VC++6.0,新建->; 工程 ->; win32 Dynamic-Link Library .在向导中选择空工程. 把刚才javah生成的那个头文件加入工程 .然后 文件->;新建->;textFile 自己做一个.c文件.实现自己的native函数.例子如下:
1 #include
2 #include "HelloWorld.h"
3 #include
4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}
备注:
其中的HelloWorld.h通常在 jdk\include\ 可以先拷贝到VC安装目录下的include目录下。一劳永逸,以后可以方便使用JNI技术,全编译一下工程,如果没有出错,则此时生成动态链接库成成功。把动态链接库拷贝到HelloWorld .java所在的目录上.
运行java HelloWorld 看结果吧.
在实际应用中比较麻烦是数据类型的转换。因为要解决java和C++数据类型互通的问题。比如java里的string 如何映射为c++里相应的字符。还希望大家一起讨论。