2014-03-03 29 views
0

glob.c無法識別的應用程序目錄的目錄:如何使Android的glob.c工作?

const char* cpath = env->GetStringUTFChars(jpath, 0); 
debug("testing converting for [%s]", cpath); 

// 
const char *patnext = cpath; 
size_t limit; 
wchar_t *bufnext, *bufend, patbuf[MAXPATHLEN]; 
mbstate_t mbs; 
wchar_t wc; 
size_t clen; 

bufnext = patbuf; 
bufend = bufnext + MAXPATHLEN - 1; 

int len = 0; 
while (bufend - bufnext >= MB_CUR_MAX) { 
    clen = mbrtowc(&wc, patnext, MB_LEN_MAX, &mbs); 

    debug("clen = %i", clen); 

    if (clen == (size_t)-1 || clen == (size_t)-2) { 
     env->ReleaseStringUTFChars(jpath, cpath); 
     return JNI_FALSE; 
    } 
    else if (clen == 0) 
     break; 

    *bufnext++ = wc; 
    patnext += clen; 
    len += clen; 
} 
for (int i=0; i<len; i++) { 
    debug("%c", patbuf[i]); 
} 
glob((const char *)patbuf, GLOB_MARK, NULL, &glob_results); 
debug("glob returned %i\n", glob_results.gl_pathc); 

返回0,但1的預期。在Github上

03-03 23:58:30.274: ERROR/NATIVE_LIB(3506):/
03-03 23:58:30.274: ERROR/NATIVE_LIB(3506): d 
03-03 23:58:30.274: ERROR/NATIVE_LIB(3506): a 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): t 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): a 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506):/
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): d 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): a 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): t 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): a 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506):/
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): c 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): o 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): m 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): . 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): e 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): x 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): a 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): m 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): p 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): l 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): e 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): . 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): W 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): i 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): d 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): e 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): C 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): h 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): a 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): r 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): D 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): e 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): m 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): o 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506):/
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): f 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): i 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): l 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): e 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): s 
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506):/
03-03 23:58:30.284: ERROR/NATIVE_LIB(3506): glob returned 0 

測試項目:https://github.com/4ntoine/WideCharDemo

怎樣纔可以解決嗎?任何走動?

+0

你從哪裏找到glob.c和glob.h?你提到的github路徑不再存在。你解決了你的問題嗎? –

回答

0

您的patbuf緩衝區是wchar_t項目的數組,您不能簡單地將其地址類型轉換爲'const char *'。 glob()期望傳遞一個真正的8位字符串的地址(例如一個UTF-8)。

此外,你永遠不會零終止你的patbuf緩衝區,這本身就是另一個嚴重的錯誤。

您應該將路徑轉換爲零終止的UTF-8字符串,並將其地址傳遞給glob()。

希望這會有所幫助。

+0

patbuf是wchar_t,所以我相信它是UTF-8字符串。看問題更新:添加代碼。您可以在問題 – 4ntoine

+0

的鏈接中看到完整的應用程序和本機代碼。否,wchar_t緩衝區不能用於保存UTF-8字符串。您應該嘗試閱讀有關Unicode代碼點及其各種編碼(UTF-8,UTF-16和Java的經過修改的UTF-8)以瞭解發生了什麼。解決您的問題的方法是將env-> GetStringUTFChars()的結果直接傳遞給glob()。之後不要忘記調用env-> ReleaseStringUTFChars()。 – Digit