2015-01-21 106 views
1

我試圖調試我的JNI函數,爲此我希望顯示傳入的jstring參數到logcat以驗證其正確性。在JNI函數中將jstring寫入logcat

我試過下面的代碼這樣做,但它一直崩潰。

LOGD(myStringArg); 

其中myStringArg被聲明爲jstring

如果我在我的JNI函數和LOGD函數中聲明並定義了另一個jstring,它就可以工作。但是,由於某種原因,如果我在JNI函數參數上調用LOGD,它會崩潰。我在內部已經驗證過jstring不是null,並且在Java函數中調用它之前,我還檢查了值是否正確。

我已經轉換的jstring到一個const char *如下:顯示

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

沒什麼,這意味着charstring類型是空的?

任何想法如何做到這一點?

謝謝。

+0

可能與[this]重複(http://stackoverflow.com/questions/4181934/jni-converting-jstring-to-char) – alijandro 2015-01-21 09:03:05

回答

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); 
} 
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

+0

我已經將jstring轉換爲一個const char *,更新了原始帖子與代碼。當我對const char *進行LOGD操作時,沒有任何東西出現,它似乎是一個空字符串。 – user1118764 2015-01-21 09:04:18

+0

'GetStringUTFLength'爲你的'jstring'返回什麼? – Michael 2015-01-21 09:22:46

0

你可以這樣試試,

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

它對我很有用。

0

試試這個: __android_log_print(ANDROID_LOG_DEBUG,「LOG_TAG」,「text:%s」,charString);