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();
}
}