学习JNI

JNI,是Android中Java与C互通,用法有两种

1.Java 调用C

2.C调用Java

 

Java调用C比较简单,首先在某个类中声明jni函数

private native void func(String str, String str);

使用javah脚本生成(老司机可以手写)C的头文件,实现该功能即可。

javah使用方法:

在源码根目录,如src目录下,执行

javah packagenamge.class

javah com.android.test.TestClass

 

C调用Java

C调用Java比较繁琐,需要反射找到Java的方法,google的GLEnvironment有一段很标准的写法

头文件

#include <jni.h>

#ifdef __cplusplus
extern "C"
{
#endif
static struct {
jclass clazzGLEnvironment;
jmethodID lastPageQuit;
} gCallJavaMethod;
void callLastPageQuit(int keycode);
void callCreateVideoView();
void callOnFirstFrame();

#ifdef __cplusplus
}
#endif

实现文件

static int register_javaCallMethod(JNIEnv *env) {
jclass clazz = gCallJavaMethod.clazzGLEnvironment;
if (!gCallJavaMethod.clazzGLEnvironment) {
clazz = env->FindClass("com/yunos/tv/blitz/GLEnvironment");
if (clazz == NULL) {
loge("register_javaCallMethod class not exist!!");
} else {
gCallJavaMethod.clazzGLEnvironment = (jclass)env->NewGlobalRef(clazz);
}
}
if (clazz && !gCallJavaMethod.lastPageQuit) {
gCallJavaMethod.lastPageQuit = env->GetStaticMethodID(clazz, "lastPageQuit", "()V");
}
if (gCallJavaMethod.lastPageQuit == NULL) {
loge("lastPageQuit method get fail!!");
}

 

void callLastPageQuit(int keycode) {
logi("kecode:%d", keycode);
if (m_Gl_VM == NULL) {
loge("vm null");
return;
}
if (gCallJavaMethod.lastPageQuit == NULL) {
loge("lastPageQuit null");
return;
}
CHECK_JVM_THREAD(m_Gl_VM);
if (error) {
return;
}
env->CallStaticVoidMethod(gCallJavaMethod.clazzGLEnvironment, gCallJavaMethod.lastPageQuit);
if (attached) {
m_Gl_VM->DetachCurrentThread();
}

}

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注