在JNI函数中将jstring写入logcat

时间:2015-01-21 08:43:11

标签: java android java-native-interface

我正在尝试调试我的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为空?

知道怎么做吗?

感谢。

4 个答案:

答案 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);