Вызов функции Java из C ++ на Android через JNI - PullRequest
2 голосов
/ 24 февраля 2012

Я звоню C ++ с Android с JNI , и пока все работает. Теперь мне нужно, чтобы в этой функции C ++ была некоторая функциональность из Java, и попытаюсь перезвонить в Java из C ++. Я проверил различные решения на stackoverflow и других источниках в сети, но я почему-то просто не мог заставить его работать.

Я всегда получаю следующее исключение "W/dalvikvm(358): JNI WARNING: can't call Lcom/main/Main;.message on instance of Lcom/main/Main;"

Кто-нибудь может дать мне какой-нибудь совет по этому поводу? Я что-то пропустил, что-то наблюдал или у меня просто неправильный код?

Вот часть Java, которую я хочу вызвать из C ++:

public class Main extends Activity  
{   
    public  native  String  JNIInit();

    String message(String text)
    {   text = text + "from java";
        return text;
    }
    .
    .
}

Это функция C ++ , которую я могу успешно вызвать из Java, но из которой я не могу перезвонить в Java:

extern "C" JNIEXPORT jstring JNICALL Java_com_main_Main_JNIInit(JNIEnv* env, jobject obj)
{   jstring jstr = env->NewStringUTF("From jni");
    jclass cls = env->FindClass("com/main/Main");
    jmethodID method = env->GetMethodID(cls, "message", "(Ljava/lang/String;)Ljava/lang/String;");
    jobject result = env->CallObjectMethod(obj, method, jstr);
    return env->NewStringUTF(str);
}

PS: я знаю, что здесь есть несколько тем на эту тему, но я все равно не смог заставить его работать. Там должно быть что-то, что я просто скучаю, и я просто не могу понять, что это такое.

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Вместо использования FindClass вы можете попробовать: (*env)->GetObjectClass(env, obj);

0 голосов
/ 24 февраля 2012

вы используете создать пустую строку в c ++, а также передать пустую строку из Java из метода

 jString pSrc = (*env)->GetString(env,source, 0);

// Здесь source - пустая строка, которую вы передаете из метода java, теперь скопируйтестрока в источник

 (*env)->String(env, source, pSrc , 0);

и в конце использования

(*env)->ReleaseString(env,source, pSrc , 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...