NDK, передача примитивных данных из c ++ в java - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть проект Android, написанный на Java, который использует ndk для некоторых вещей openGL ..

Я получил функцию cpp, которая вызывает вызов, и оттуда я хочу вызвать функцию java

C ++:

JNIEXPORT void JNICALL
Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRenderer_renderFrame(JNIEnv* env, jobject obj)
{
jclass activityClass = env->GetObjectClass(obj);

// Do something
char* argToPass = "Some string";
        jmethodID functionID = env->GetMethodID(activityClass,
                                                    "CallBack", "()V");
        env->CallObjectMethod(obj, functionID, 0); 
}

Java:

public  void CallBack(string arg){
 // Do sometihng
 }

Вопрос в том, как мне передать аргумент argToPass в функцию java

Спасибо ...

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

См. Здесь для подробного описания вызова java-методов через jni.

Похоже, вы подписали неверный метод. Ссылка выше содержит хорошее описание того, как определить сигнатуру вашего метода. Вот как должен выглядеть ваш вызов GetMethodId:

jmethodID functionID = env->GetMethodID(
    activityClass,
    "CallBack", 
    "(Ljava/lang/String;)V");

Тогда, когда вы вызываете свой метод, вы делаете это так:

env->CallVoidMethod(
    obj,
    functionID,
    env->NewStringUTF(argToPass));

Обратите внимание, что я использовал CallVoidMethod, поскольку ваше возвращаемое значение в Java является недействительным.

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

Чтобы создать строку, которую можно передать или вернуть в Java, используйте NewStringUTF ():

JNIEXPORT jstring JNICALL Java_com_something_or_other_makeString(JNIEnv *env, jobject obj)
{
char *myString = "This is a test";
return (*env)->NewStringUTF(env, myString);
}
...