Сложность здесь в том, что вы хотите вызвать собственный код C ++, который вы, в свою очередь, хотите вызвать java-метод. Это на самом деле немного сложно.
Вам нужно создать функцию JNI C ++ для вызова java и сопоставления функций C ++
подпись обратного вызова MyCPPFunction. Последний будет выступать в качестве оболочки для вызова метода Java.
Поскольку оболочке потребуется информация о среде JNI, которая не может быть предоставлена параметрами (чтобы мы не испортили подпись), вы создаете несколько глобальных переменных для ее хранения:
jobject g_getSizeIface;
jmethodID g_method;
JNIEnv *g_env;
Функция C ++, которую вызовет java, выглядит следующим образом:
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){
std::cout << "could not get method id!" << std::endl;
return;
}
g_method = method;
g_getSizeIface = getSizeInterface;
g_env = env
MyCPPFunction(size, WrapperFunc);
}
И функция-обертка выглядит так:
int WrapperFunc(int *id)
{
jint retval;
//marshalling an int* to a m_SizeClass boogy-woogy.
...
g_env->ExceptionClear();
retval = g_env->CallIntMethod(g_getSizeIface, g_method,
/*marshalled m_SizeClass*/);
if(g_env->ExceptionOccurred()){
//panic! Light fires! The British are coming!!!
...
g_env->ExceptionClear();
}
return rvalue;
}