JNI快速入门
JNI为Java Native Interface 即Java本地接口,使用此种机制可以实现Java和C/C++互相调用.本文对该机制进行快速入门,
并记录了我在整个过程中遇到的问题及解决方法。
Java调用C++代码
Java调用C++代码本质上是对C++生成的动态库进行调用而不是直接对C/C++代码进行调用。
第一步:设计Java端接口;
public class HelloJNI {
/**
* @param args
Native关键字
*/
private native void printMsg();
public static void main(String[] args) {
// TODO Auto-generated method stub
new HelloJNI().printMsg();
}
static {
//静态代码块中的代码加载dll,保证该类的dll文件只被加载一次
System.loadLibrary("HelloJNI");
}
}
命令行编译:javac HelloWorld.java
第二步:使用javah工具生成C++接口文件.
Javah HelloJNI 生成文件HelloJNI.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: printMsg
* Signature: ()V
方法签名:用来映射C++function Java_HelloJNI_printMsg和Java function printMsg的参数和返回值
可以使用命令:[ javap -s -private 类名] 来查看方法签名
参数说明:
JNIEnv* :JNI环境指针.该指针为JVM当前中当前线程的句柄,包含一些映射信息和管理信息
Jobject :调用该本地方法的方法的引用,如果调用方法(本地方法调用者)是静态方法,该参数将是jclass类型
*/
JNIEXPORT void JNICALL Java_HelloJNI_printMsg
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
参数说明:
JNIEnv* :JNI环境指针.