我正在尝试调试我的JNI
函数,并且这样做我希望将jstring
参数显示给logcat
以验证其正确性。
我已经尝试了以下代码,但它一直在崩溃。
LOGD(myStringArg);
其中myStringArg
被声明为jstring
。
如果我在jstring
函数和JNI
中声明并定义了另一个LOGD
,那么它就可以了。但是,出于某种原因,如果我在LOGD
函数参数上调用JNI
它会崩溃。我已在内部验证jstring
不为空,在Java函数中调用它之前,我也检查该值是否正确。
我已将jstring转换为const char *,如下所示:
const char *charString;
charString = (const char*)(*env)->GetStringUTFChars(env, myStringArg, NULL);
LOGD(charString);
没有显示任何内容,这意味着charString为空?
知道怎么做吗?
感谢。
答案 0 :(得分:1)
您可以尝试使用此方法从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);
}
答案 1 :(得分:0)
您需要将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。
答案 2 :(得分:0)
你可以这样试试,
LOGD("String from java is %s\n",charString);
它对我有用。
答案 3 :(得分:0)
试试这个: __android_log_print(ANDROID_LOG_DEBUG,“LOG_TAG”,“text:%s”,charString);