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
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
手机扫一扫
移动阅读更方便
你可能感兴趣的文章