2012-03-02 2 views
2

Может кто-то показать мне, как вызвать метод Java от Objective C.Objective C вызова метода Java с использованием JNI

Более подробно это на самом деле то, что я хотел бы сделать

1) Есть первый звонок от сторона java к объекту C. во время этого вызова, я хотел бы получить ссылку на объект java.

2) Позже по линии я хотел бы, чтобы Objective C использовал ссылку, полученную на предыдущем шаге, для вызова методов Java.

Thanks

+0

Объектив C является надлежащим надмножеством C, поэтому, независимо от кода, который вы работаете на C, просто перейдите и запустите его в ObjC. – Perception

+0

Что заставляет вас думать, что у меня есть код C. :-) – user1216750

+0

На самом деле я это делаю, и это один из подходов, которые я готов принять. Но код C, который у меня есть, сложный. Есть много других вещей, которые делаются на C, и есть много сцеплений, мне трудно следовать и просто делать то же самое. Также я надеялся сохранить весь код в Objective C – user1216750

ответ

4

Следующие, похоже, работают. Он основан на приведенном выше комментарии по следующим примерам 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); 

} 

Надеюсь, это поможет.

+0

Как Java может вызвать Objective-C в проекте Objective-C. Был вопрос о вызове Java из Obejctive-C. В начале вашего аведера вы «имеете первый вызов со стороны Java на цель C»? – Lealo

Смежные вопросы