jni 的简单例子

 

本文主要是用以实现 JNI 的简要例子

JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。

主要分为4个步骤:

1、c 语言编译成 so 库文件

2、java 语言中 load  .so 库文件

3、定义好本地 native 函数

4、调用

 

C 语言部分

1、定义好我们自己的函数功能

//定义我们的C函数
void c_hello(JNIEnv *env, jobject cls)
{
	printf("Hello, world!\n");
}

2、定义 JNINativeMethod

Andoird 中使用了一种不同传统Java JNI的方式来定义其native的函数。其中很重要的区别是Andorid使用了一种Java 和 C 函数的映射表数组,并在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMethod,定义如下:

typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;

第一个变量name是Java中函数的名字。

第二个变量signature,用字符串是描述了函数的参数和返回值

第三个变量fnPtr是函数指针,指向C函数。
 

static const JNINativeMethod methods[] = {
	{"hello", "()V", (void *)c_hello},
};

3、把JNINativeMethod注册到 Android 中去

/这个是一个通用的函数模板
/* System.loadLibrary */
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; /* JNI version not supported */
	}
    //注意了,这里要改成你的 类的路径
	cls = (*env)->FindClass(env, "com/example/administrator/testjni/MyNativeTest");
	if (cls == NULL) {
		return JNI_ERR;
	}

	/* 2. map java hello <-->c c_hello */
	if ((*env)->RegisterNatives(env, cls, methods, 1) < 0)
		return JNI_ERR;

	return JNI_VERSION_1_4;
}

 

JAVA 语言部分:

load 本地 so 文件:

static { 		/* 1. load */	//注意需要使用静态代码块
System.loadLibrary("native");	//这里相当于调用了本地的  native 库
}

定义好本地 native 方法并调用

public native void hello();
JNIDemo d = new JNIDemo();
d.hello();

 

你可能感兴趣的:(Android,驱动)