25.2.5 通过JNI混合Java和C++(www.cppentry.com)(2)
然后使用javah(作者喜欢把这个程序读成jav-AHH!)程序为这个原始方法创建一个头文件:
- javah HelloCpp
javah运行完毕后,您会发现一个名为HelloCpp.h的文件,这是一个可以完全正常工作(只不过有点丑陋)的C/C++(www.cppentry.com)头文件。在这个头文件内是一个名为Java_HelloCpp_callCpp()的函数的C函数定义。您的C + +程序需要实现这个功能。完整原型如下:- JNIEXPORT void JNICALL Java_HelloCpp_callCpp(JNIEnv* env, jobject javaobj);
这个函数的C++(www.cppentry.com)实现可以充分利用C++(www.cppentry.com)语言的特性。这个例子通过C++(www.cppentry.com)输出一些文本。首先,您需要包含jni.h头文件和javah创建的HellpCpp.h文件。您还需要包括任何您需要使用的C或C++(www.cppentry.com)头文件:- #include <jni.h>
- #include "HelloCpp.h"
- #include <iostream>
- 代码取自JNI\HelloCpp.cpp
按照正常的方式编写C++(www.cppentry.com)函数。这个函数的参数允许和Java环境以及调用这个原生代码的对象交互。这些内容超出了这个例子的范围。- JNIEXPORT void JNICALL Java_HelloCpp_callCpp(JNIEnv* env, jobject javaobj)
- {
- std::cout << "Hello from C++(www.cppentry.com)!" << std::endl;
- }
-
- 代码取自JNI\HelloCpp.cpp
将这段代码编译为一个库取决于您的环境,但您肯定要调整一下编译器的设置以包含JNI头文件。如果在Linux上使用GCC编译器,编译命令可能看起来像这样: - g++ -shared -I/usr/java/jdk/include/ -I/usr/java/jdk/include/linux HelloCpp.cpp \
- -o hellocpp.so
从编译器的输出是由Java程序使用的库。只要这个共享库在Java类路径的某个位置,您就可以正常执行Java程序:- java HelloCpp
应该可以看到以下结果:- Hello from Java!
- Hello from C++(www.cppentry.com)!
当然,这个例子只介绍了JNI的冰山一角。您可以通过JNI与操作系统相关的特性或硬件驱动程序交互。有关JNI的完整内容,请参阅Java教材。