编程环境:
Windows操作系统
jdk1.5
Eclipse
VC6.0
一、使用 Java 的 JNI 调用 C/C++ 的动态联结库有个固定的步骤,下面将以一个最简单的 HelloWorld 例子程序来说明调用过程。这个 HelloWorld 的例子只是简单的显示 HelloWorld 消息。 通过这个例子可以了解调用流程。
第一步、编写java类
第五步、在Java中运行测试程序
先将生成的DLL拷贝到工程的目录下D:\workspace\jnitest,刷新一下java工程,Run As Java Application即可。
public class HelloWorld { public native void print(); public static void main(String[] args) { new HelloWorld().print(); } static { // System.loadLibrary("HelloWorld"); System.load(System.getProperty("user.dir") + "\\dllTest.dll"); }}
第二步、编译Java类
在Eclipse工具中编译Java类,编译后的class文件会自动放入工程目录下的bin目录中
第三步、生成C/C++头文件
在windows中打开一个DOS命令窗口,我电脑上DOS的默认路径是C:\Users\s001,此处可以不修改默认路径,后面生成的.h文件就会自动放在改路径下,如果这个默认路径不好找,可以输入d:命令,将路径修改为D盘下,路径了解后,就要键入javah D:\workspace\jnitest\bin HelloWorld 命令生成头文件HelloWorld.h。内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */#include/* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method: print * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_print (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
第四步、在VC中编写本地方法实现
用VC6创建名为HelloWorldWin32动态链接库工程(Dynamic Link Library)。将上述头文件HelloWorld.h拷贝到HelloWorld工程目录下,
将C:\Program Files\Java\jdk1.5.0_06\include目录下的jni.h和
C:\Program Files\Java\jdk1.5.0_06\include\win32目录下的jni_md.h
拷贝到C:\Program Files\Microsoft Visual Studio\VC98\Include目录下。在VC IDE中新建HelloWorld.cpp文件,实现头文件中声明的方法并编译成DLL。
#include#include #include "HelloWorld.h"#include "procDemo.h"//自定义了个头文件用于调用pro*c的方法JNIEXPORT void JNICALLJava_HelloWorld_print(JNIEnv *env, jobject obj){ //调用pro*c的代码 execute(); printf("Hello World ni mei o !\n"); return;}
procDemo.h
#pragma once#ifdef __cplusplusextern "C" {#endifvoid execute();#ifdef __cplusplus};#endif
procDemo.pc
#include#include #include #include #include execute(){EXEC SQL BEGIN DECLARE SECTION; char *aaa = "a"; int age=5; int pid=0; int page=12849456; EXEC SQL END DECLARE SECTION; //char *aaa = "a"; // int age=5; char *uid = "scott/tiger@TEST_dist"; EXEC SQL CONNECT :uid; age=10; EXEC SQL SELECT id INTO:pid FROM student WHERE age=:page; // EXEC SQL CREATE TABLE mybooks // ( acqnum number, copies number , price number); EXEC SQL FOR:age INSERT INTO student VALUES(:age,:aaa,:age); // EXEC SQL DELETE FROM student; // EXEC SQL INSERT INTO student VALUES(500,:aa,500); // EXEC SQL UPDATE student SET st_name = 'mm' where id = 2; EXEC SQL COMMIT WORK; //if(pid==12849456) // printf("查询成功 "); if(sqlca.sqlcode==0) printf("连接成功!pid value is /n"); printf("%.*s/n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);} int main(){ execute();}