JAVA程序通过JNI调用C/C++库
阅读原文时间:2023年07月09日阅读:2

java程序如何调用c/c++库中的函数主要分为三个步骤:

  1. 加载库文件. System.loadLibrary

  2. 找到函数( java函数<----映射---->c函数 )

  3. 调用函数

在映射中一般分为显式建立和隐式建立。

显式建立:

下面举个例子:

/*
filename native.c
commod: gcc -shared -o libnative.so native.c -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include -fPIC
*/
#include
#include /* /usr/lib/jvm/java-1.7.0-openjdk-amd64/include */

int c_hello( JNIEnv *env, jobject cls, jint num )
{

printf("hello  c/c++ num=%d\\r\\n",num);  
return num\*2;  

}

/* 2. java <--> C */

static const JNINativeMethod methods[] = {
{"hello","(I)I",(void *)c_hello}, /* java function 参数 c function*/
};

JNIEXPORT jint JNICALL

JNI_OnLoad( JavaVM *jvm, void *reserved )
{
JNIEnv *env;
jclass cls;

/\* 获取运行环境 \*/  
if((\*jvm)->GetEnv(jvm,(void \*\*)&env,JNI\_VERSION\_1\_4))  
    return JNI\_ERR;

/\* 获取java中的类 \*/  
cls = (\*env)->FindClass(env,"JNIDemo");  
if(cls==NULL)  
    return JNI\_ERR;

/\* 函数映射 \*/  
if((\*env)->RegisterNatives(env, cls, methods,1)<0)  
    return JNI\_ERR;

return JNI\_VERSION\_1\_4;  

}

java代码:

/*
* filename JNIDemo.java
* commod: javac JNIDemo.java
* */
public class JNIDemo {
static {
/* 1. load */
System.loadLibrary("native"); /*libnative.so*/
}
public native static int hello( int num );
public static void main( String args[] )
{
/* 2. java <--> C */

    /\* 3. call \*/  
    System.out.println( hello(123) );  
}  

}

jni中字段描述符:

也可以通过java来生成头文件从而获取描述符。

先编译java程序   javac JNIDemo.java

            javah -jni JNIDemo
将会生成 JNIDemo.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class JNIDemo */

#ifndef _Included_JNIDemo
#define _Included_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNIDemo
* Method: hello
* Signature: (I)I
*/
JNIEXPORT void JNICALL Java_JNIDemo_hello
(JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif