JNI=java native interface,是一种技术,通过这种技术可以做到:java代码调用C/C++代码,C/C++代码代用java代码
java层的代码,首先调用System.loadLibrary();然后调用声明为native的java函数,声明为native的函数JVM会去JNI库那里找对应的JNI函数调用
而JNI函数那边是用C/C++语言写的,故可以使用printf()这些函数,下面是一个简单例子:
class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
利用javah工具可以生成一个.h文件:
javah ?jni HelloWorld
头文件的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
然后建立一个.c或者.cpp来包含这个头文件,就可以使用C/C++语言来写代码:
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}
总结下就是先找出一个类中成员函数和成员变量的ID,然后用Call<Type>Method来根据函数ID来调用java层的函数,用Get<type>Field来获取成员ID的值,这样就在C/C++中调用了Java层的类成员了。