这里的复杂情况是,您想要调用本机C代码,而这些代码又要调用java方法.这实际上有点棘手.
你需要创建一个JNI C函数来调用java和一个C函数进行匹配
MyCPPFunction回调签名.后者将作为一个包装器来调用java方法.
因为包装器将需要有关JNI环境的信息,这些信息不能由参数提供(以免破坏签名),您可以创建一些全局变量来保存它:
jobject g_getSizeIface;
jmethodID g_method;
JNIEnv *g_env;
java将调用的C函数如下:
JNIEXPORT void JNICALL Java_ClassName_MyCPPFunction
(JNIEnv *env, jint size, jobject getSizeInterface)
{
jclass objclass = env->GetObjectClass(getSizeInterface);
jmethodID method = env->GetMethodID(objclass, "GetSize", "(m_SizeClass)I");
if(methodID == 0){
cout << "could not get method id!\n";
return;
}
g_method = method;
g_getSizeIface = getSizeInterface;
g_env = env
MyCPPFunction(size, WrapperFunc);
}
因此包装功能是: