在 JNI 函数中将 jstring 写入 logcat

Writing jstring to logcat in JNI function

我正在尝试调试我的 JNI 函数,这样做时我希望显示 logcat 的传入 jstring 参数以验证其正确性。

我已尝试使用以下代码来执行此操作,但它总是崩溃。

LOGD(myStringArg);

其中 myStringArg 声明为 jstring.

如果我在我的 JNI 函数中声明并定义另一个 jstring 并且 LOGD 那个,它就可以工作。但是,出于某种原因,如果我在 JNI 函数参数上调用 LOGD 它会崩溃。我已经在内部验证 jstring 不为空,并且在 Java 函数中调用它之前,我还检查了该值是否正确。

我已经将 jstring 转换为 const char * 如下:

const char *charString;
charString = (const char*)(*env)->GetStringUTFChars(env, myStringArg, NULL);
LOGD(charString);

没有任何显示,表示charString为空?

知道怎么做吗?

谢谢。

您需要将 jstring 转换为原生 char*string。例如:

// Get a pointer to an array of bytes representing the string in modified UTF-8 encoding
char *str = env->GetStringUTFChars(myStringArgs, NULL);

// Now you can log str

// Inform the VM that the native code no longer needs access to str
env->ReleaseStringUTFChars(myStringArg, str);

有关 JNI 函数的详细信息,请参阅 http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html

您可以尝试使用此方法从 jstring 中提取字符:

const char* getCharFromString(JNIEnv* env, jstring string){
    if(string == NULL)
        return NULL;

    return  env->GetStringUTFChars(string ,0);
}

这样您就可以将 jstring 打印为 (const char*):

LOGD(getCharFromString(env, myStringArg));

如果打印此字符串时仍有问题,请尝试使用以下方法调试内容:

int getBytesNeededByString(JNIEnv* env, jstring string){
    return env->GetStringUTFLength(string);
}

int getNumberOfCharsInString(JNIEnv* env, jstring string){
    return env->GetStringLength(string);
}

你可以这样试试,

LOGD("String from java is %s\n",charString);

它对我有用。

试试这个: __android_log_print(ANDROID_LOG_DEBUG, "LOG_TAG", "text:%s ", charString );