2014-07-22 3 views
1

Java 코드에서 JNI를 사용하여 원시 C 코드를 호출합니다. 이것은 잘 작동하며 C 코드에서 일부 처리를 수행하고 있습니다. C 코드는 이벤트 리스너를 등록하여 C 부분에서 새로운 결과가 준비 될 때마다 알림을받습니다.JNI를 사용하여 C에서 Java로 콜백을 구현하는 방법은 무엇입니까?

은 지금은 그런 자바 코드에 결과를 반환 할 :

void notifyGazeEvent() 
{ 
    jclass cls = (*env)->GetObjectClass(env, obj); 
    jmethodID mid = (*env)->GetMethodID(env, cls, "newGazeEvent", "(I)V"); 
    if (mid == 0) 
    { 
     return; 
    } 
    printf("In C, about to enter Java"); 
    (*env)->CallVoidMethod(env, obj, mid, 1); 
} 

문제는 지금 : 나는 JNIEnv의 객체와의하는 jobject 객체를 구할 수있는 곳 모른다.

JNIEXPORT void JNICALL 
Java_a_b_C_doCalculation(JNIEnv *env, jobject obj) 
{ 
// here I register all the handlers etc, 
} 

그러나 나는 자바 콜백을 수행 나의 방법까지 참조를 전달할 수있는 방법을 모른다 : 내가 처음 C 코드를 호출 할 때 전달됩니다.

+0

[JavaCPP - 콜백 함수 만들기] (https://github.com/bytedeco/javacpp#creating-callback-functions)에서 확인할 수 있습니다. 그것은 당신에게 많은 문제를 줄 것입니다. –

답변

1

의 기능을 Java_a_b_C_doCalculation 외부에 유지하려면 함수가 반환 된 후에 모든 개체 (JNIEnv도 가능)가 더 이상 유효하지 않으므로 전역 참조를 만들어야합니다. 글로벌 참조는 NewGlobalRef으로 쉽게 만들 수 있습니다.

JNIEnv 포인터를 저장할 수 없습니다. notifyGazeEvent()을 호출하는 스레드가 C에서 작성된 경우에도 스레드를 JVM에 먼저 연결해야합니다. JavaVM *vm 포인터를 JNI_OnLoad에서 저장하고 GetEnv으로 JNIEnv를 입력하거나 AttachCurrentThread (AsDaemon)으로 새로 만든 스레드를 첨부하십시오.

관련 문제