基于JNI,JAVA 调用 C++入门
1.步骤一览
2.步骤详情
2.1. 编写Java类 native
package com.ibugs.jni; /** * * @author i_bugs * */ public class CProcessor { // 声明native方法 public native boolean checkValid(); public native String processData(String str); }
2.2.编译Class
首先编译CProcessor类,得到CProcessor.class
2.3.生成头文件
然后生成对应头文件com_ibugs_jni_CProcessor.h, 在cmd窗口下,命令:javah com.ibugs.jni.CProcessor
以下是头文件中的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_ibugs_jni_CProcessor */ #ifndef _Included_com_ibugs_jni_CProcessor #define _Included_com_ibugs_jni_CProcessor #ifdef __cplusplus extern "C" { #endif /* * Class: com_ibugs_jni_CProcessor * Method: checkValid * Signature: ()Z */ JNIEXPORT jboolean JNICALL Java_com_ibugs_jni_CProcessor_checkValid (JNIEnv *, jobject); /* * Class: com_ibugs_jni_CProcessor * Method: processData * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_ibugs_jni_CProcessor_processData (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif
其中,Java_com_ibugs_jni_CProcessor_checkValid (JNIEnv *, jobject),Java_com_ibugs_jni_CProcessor_processData (JNIEnv *, jobject, jstring)这两个方法需要我们用C++来实现
2.4.C++实现本地方法
这里借助Visual Studio2012,新建项目
在Application Settings设置Appliction Type中,请选择DLL, Addition options 选择Empty project选项如下
Source Files目录新建CProcessor.cpp文件,用来实现Java要调用的方法
#include "com_ibugs_jni_CProcessor.h" JNIEXPORT jboolean JNICALL Java_com_ibugs_jni_CProcessor_checkValid (JNIEnv *, jobject){ return true; } JNIEXPORT jstring JNICALL Java_com_ibugs_jni_CProcessor_processData (JNIEnv *, jobject, jstring str){ return str; }
2.5.编译动态链库
设置编译的机器位数32位或者64位,右击项目Property进入Configuration Manager窗口这里可以调整编辑Dll的位数不再赘述
然后build工程即可。则在项目工程目录中找到CProcessor.dll文件
2.6.加载调用动态链库
package com.ibugs.jni; public class TestCProcessor { // 加载动态链库 static { System.loadLibrary("CProcessor"); } public static void main(final String[] args) { CProcessor cProcessor = new CProcessor(); System.out.println("checkValid()result:" + cProcessor.checkValid()); System.out.println("processData()result:" + cProcessor.processData("hello")); } }
注意:要将CProcessor.dll放入java.library.path,我这里将动态链库直接放到Windows/System32下面,否则无法加载。在loadLibrary时,不需要写明后缀.dll
3.小结
在用JNI调用C++过程中主要就是生成native方法对应的头文件,然后用C/C++实现头文件中的方法,编译成DLL动态链库就可以调用了。