Android上的JNI:如何从Java代码中检索字符串?

时间:2012-01-31 21:20:23

标签: java android c++ c android-ndk

我读了很多例子来检索C / C ++代码中的java字符串,但似乎我错过了一些东西。这个简单的代码不起作用..

在ActivityTest(android java code)中我已经:

public static native void nativeInit(String stringfromjava);

在TestActivity中我:

ActivityTest.nativeInit("test");

和我的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: 

我错了......?

固定 感谢Mario,从签名中删除“jobject obj”修复了我的问题!

1 个答案:

答案 0 :(得分:4)

到目前为止只编写了一个简短的测试(类似于你的程序),但是我的函数有一些不同的签名(可能取决于SDK / NDK / JDK版本?从我发现的一些教程代码中取出):

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

如果你不写C ++,显然你不需要extern "C"

Java签名将是:

native void method(String param);

编辑:

获取字符串(不确定这是否100%正确,但它有效):

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

如果出现问题,请提供建议。它工作正常,但可能仍然存在问题,所以请随意发表评论。