Следующие, похоже, работают. Он основан на приведенном выше комментарии по следующим примерам C и этой ссылке.
http://urlgrey.net/?p=121
Как ссылка говорит не создать глобальную переменную для окр вместо создания глобальной переменной в JVM, а также создать глобальную ссылку на свой класс.
Вот как я реализую шаг 1: « 1) имеют первый вызов с Java стороны к объективному С во время этого разговора я хотел бы получить ссылку на объект Java »
Сначала объявить глобальную переменную в файле заголовка для
1) Jvm:
JavaVM *jvm;
2) Java-класс:
jclass smartCallbackClass;
3) Java-объект:
jobject smartCallbackObject;
Далее в вызове, который приходит со стороны Java к цели C установить значения для этих переменных
1) для виртуальной машины Java:
(*env)->GetJavaVM(env, &jvm);
2) для объекта:
smartCallbackObject = (*env)->NewGlobalRef(env, obj);
3) Для класса:
if (smartCallbackClass == NULL) {
jclass localRefCls = (*env)->FindClass(env,"com/studyisland/nativelibs/smart/responsesdk/interfaces/thin/SMARTResponseThinClient");
if (localRefCls == NULL) {
NSLog(@"Unable to create a JNI Java Class reference \n");
}
//Create a global reference for JNI Java class
smartCallbackClass = (*env)->NewGlobalRef(env,localRefCls);
//Delete the local reference as it is no longer needed
(*env)->DeleteLocalRef(env, localRefCls);
//Is the global reference created successfully?
if (smartCallbackClass == NULL) {
NSLog(@"Unable to create JNI Java class reference \n");
return 0;
}
}
Вот ссылка, где я получил код для класса
http://java.sun.com/docs/books/jni/html/refs.html
Теперь второй шаг
" 2) Позже в строке я хотел бы, чтобы Objective C использовал ссылку, полученную на предыдущем шаге, для вызова методов Java «
Чтобы позвонить из Objective C обратно в Java, вам нужно убедиться, что вызов выполняется в том же потоке, с помощью которого Java называется Objective C, так что вот код.
-(void)classFailedToStop:(SMARTResponseCallBackEventArg*)anArg{
JNIEnv *env;
int attach = (*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL);
if(attach == 0){
(*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_4);
jmethodID method = (*env)->GetMethodID(env, smartCallbackClass, "callback_onStopClassFailed", "()V");
(*env)->CallVoidMethod(env, smartCallbackObject, method);
}
(*jvm)->DetachCurrentThread(jvm);
}
Надеюсь, это поможет.
Объектив C является надлежащим надмножеством C, поэтому, независимо от кода, который вы работаете на C, просто перейдите и запустите его в ObjC. – Perception
Что заставляет вас думать, что у меня есть код C. :-) – user1216750
На самом деле я это делаю, и это один из подходов, которые я готов принять. Но код C, который у меня есть, сложный. Есть много других вещей, которые делаются на C, и есть много сцеплений, мне трудно следовать и просто делать то же самое. Также я надеялся сохранить весь код в Objective C – user1216750