同学写个项目,需要用Java调用C++写好的socket,我帮下忙。
用Java写好一个类,声明一定的类方法。注意是声明,比如
其中的native关键字表明是链接到外部dll的方法,同时也在外部定义。
然后在类内部加上装载库文件的语句块
虚拟机在当前工作目录中寻找对应Revision.dll文件。如果是用命令行java Revision这样运行,工作目录就在class的所在文件夹,如果是用IDE运行,则由IDE决定,比如eclipse是整个项目的根目录。
然后javac编译这个类
如:javac Revision.java
在产生.class的文件夹里,用javah命令创建这个Java类对应的.h头文件
如: javah Revision
之后会在同文件夹里产生Revision.h
Java类Revision的信息已经包含在这个函数的标识符中了,同时__declspec(export)等win32的dll编译宏业已经在声明中前面包含了,所以不用多管。新建一个同名的c/cpp文件,include这个头文件,然后include需要的C/C++标准库文件,对头文件中的方法进行定义实现。在源文件里,定义函数的时候可以把这两个参数JNIEnv *, jobject 确定一个变量名比如JNIEnv * env,就可以调用JNI提供的虚拟机实现的API,可以把C/C++的数据逐步转化为Java数据,
比如这里的NewStringUTF就是产生Java字符串对应的C++字符串的方法,然后虚拟机会把jstring在运行时自动对应到Java的String类。具体的更多API实现,可以参考JNI的文档。
然后用gcc/g++来编译这个源文件。
> g++ -Wl,--kill-at -shared -o Revision.dll Revision.cpp
编译成功后,把dll放到工作目录里,正常运行调用了Java的Revision类的getHook方法的代码就可以了。