Как вызвать Java-метод со стороны JNI? - PullRequest
1 голос
/ 19 мая 2011

Я выполнил некоторые функции c-кода на стороне jni, и все работает нормально.

public native String getMessage() 

функция возвращает строку со стороны jni в сторону java, и она работает нормально, а все остальные коды jni также работают нормально.Но проблема в том, как я могу вернуть строку в функции jni, которая без использования return, поэтому

public native void getMessagewithoutReturn()

должна быть в состоянии вернуть строку.Затем я получаю функцию getMessagewithoutReturn (), которая никогда не завершает цикл с использованием pthread, как показано ниже: (это работает)

pthread_t native_thread;
pthread_create(&native_thread, NULL, native_thread_start_reading, env);

и каждое время итерации цикла я должен иметь возможность возвращать строку, поэтому я не могуиспользуйте return, потому что он останавливает выполнение функции.

pthread_t native_thread;
pthread_create(&native_thread, NULL, native_thread_start_reading, env);sted out that 

Я проверил этот поток posix и все прекрасно работает на стороне Android, потому что он не был рабочим потоком, но теперь просто проблема с получением строкив каждой итерации, без использования функции возврата.

1 Ответ

9 голосов
/ 19 мая 2011

Мое предложение:

Создайте класс, который получит строку (вы также можете использовать интерфейс или абстрактный класс):

class ResultHandler { 
    public void onReturnedString(String str) 
    { 
        /* Do something with the string */ 
    } 
}

Затем измените прототип вашей функции:

public native void getMessagewithoutReturn(ResultHandler handler);

и нативная функция станет:

void  Java_com_foo_bar_getMessagewithoutReturn(JNIEnv *env, jobject thiz, jobject handler);

Теперь вам нужно вызвать onReturnedString обработчика, чтобы использовать функции JNI:

 jmethodID mid;
 jclass handlerClass = (*env)->FindClass(env, "com/foo/bar/ResultHandler");
 if (handlerClass == NULL) {
     /* error handling */
 }
 mid = (*env)->GetMethodID(env, handlerClass, "onReturnedString", "(Ljava/lang/String;)V");
 if (mid == NULL) {
     /* error handling */
 }

Тогда, когда вам нужно вызвать функцию: (я полагаю, что resultString является jstring)

 (*env)->CallVoidMethod(env, handler, mid, resultString);

Я не проверял код, но у вас есть основные идеи.

Некоторые ссылкии образец кода здесь

...