【问题标题】:JNI on Android: How to retrieve a string from Java code?Android 上的 JNI:如何从 Java 代码中检索字符串?
【发布时间】:2012-01-31 21:20:23
【问题描述】:

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

在 ActivityTest(android java 代码)中我已经:

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: 

我哪里错了...?

已修复 感谢马里奥,从签名中删除“jobject obj”解决了我的问题!

【问题讨论】:

  • 如果马里奥的回答为您解决了问题,您应该将他的回答标记为已接受(点击他回答旁边的勾号)。
  • 你有没有像这样在Java中添加一个静态块:static { nativeInit(); }

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


【解决方案1】:

到目前为止只写了一个简短的测试(类似于你的程序),但我的函数有一点不同的签名(可能取决于 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);

如果其中有问题,欢迎提出建议。它工作正常,但可能仍然存在一些问题,所以请随时发表评论。

【讨论】:

  • 这与 OP 所做的相同。
  • @ethan:不是。我跳过了参数列表中的jclass 以及字符串函数中的JNIEnv
  • 我遇到了完全相同的问题。谢谢!
猜你喜欢
  • 2010-10-29
  • 2017-07-16
  • 2017-11-30
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多