JNI на Android: как получить строку из кода Java? - PullRequest
5 голосов
/ 01 февраля 2012

Я прочитал много примеров, чтобы получить строку Java в коде C / C ++, но мне кажется, что я что-то упустил. этот простой код не работает ..

В ActivityTest (Java-код Android) я:

public static native void nativeInit(String stringfromjava);

В TestActivity у меня есть:

ActivityTest.nativeInit("test");

и в моем тесте jni.c:

JNIEXPORT void JNICALL  Java_com_test_jni_ActivityTest_nativeInit(JNIEnv* env, jclass cls, jobject obj, jstring stringfromjava){

__android_log_print(ANDROID_LOG_INFO, "TESTJNI","Native Init started");

const char* w_buf = (*env)->GetStringUTFChars(env, stringfromjava, 0);

if(w_buf == NULL) {
    __android_log_print(ANDROID_LOG_INFO, "TESTJNI","file path recv nothing");
}

else {
        __android_log_print(ANDROID_LOG_INFO, "TESTJNI","String: %s", w_buf);
}

(*env)->ReleaseStringUTFChars(env, stringfromjava, w_buf);

}

Но в моем logcat я получаю только:

I/TESTJNI (18921): Native Init started
I/TESTJNI (18921): String: 

Где я не прав ...?

FIXED Благодаря Марио, удаление «jobject obj» из подписи устранило мою проблему!

1 Ответ

4 голосов
/ 01 февраля 2012

Пока написал только один короткий тест (похожий на вашу программу), но моя функция имела несколько иную сигнатуру (может зависеть от версии SDK / NDK / JDK? Она взята из некоторого учебного кода, который я нашел):

extern "C" void Java_com_whatever_Activity_method(JNIEnv* env, jobject jthis, jstring param);

Очевидно, вам не понадобится extern "C", если вы не пишете на C ++.

Подпись Java будет:

native void method(String param);

Edit:

Чтобы получить строку (не уверен, что это на 100% правильно, но это работает):

const char *cparam = env->GetStringUTFChars(param, 0);
// .. do something with it
env->ReleaseStringUTFChars(param, cparam);

Открыт для предложений, если там что-то не так. Это работает нормально, но все еще может быть проблемой, поэтому не стесняйтесь комментировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...