2012-10-20 40 views
1

可能重複:
jni converting jstring to char *參數傳遞的本地方法

有上С功能(traverser.c模塊)

long int 
Traverser(const char * sTraversingRoot) 
{ 
    long int nCount; 
    struct stat rStatBuf; 
    time_t nTime; 
    char sActualPath[512]; 
    PGconn *pConn; 

    // Open DB connection 
    sprintf(sConnInfo, 
     "hostaddr=%s port=%s connect_timeout=50 dbname=%s user=%s password=%s", 
     sIP, sPort, sDBName, sLogin, sPassword); 
    pConn = PQconnectdb(sConnInfo); 
    if (PQstatus(pConn) == CONNECTION_BAD) { 
     AddErrorToLog("No connect\n"); 
     return 0; 
    } 

    GetActualPath(sActualPath, sTraversingRoot); 

    if (*sActualPath) { 
     stat(sActualPath, &rStatBuf); 
    } else { 
     stat("/", &rStatBuf); 
    } 

    if (nClock) 
     nTime = time(NULL); 

    if(S_ISREG(rStatBuf.st_mode)) { 
     nCount = 1; 
     ProcessFile(pConn, sActualPath); 
    } 

    if(S_ISDIR(rStatBuf.st_mode)) { 
     nCount = _Traverser(pConn, sActualPath); 
    } 

    if (nClock) 
     fprintf(stdout, "Total time : %u second(s)\n", time(NULL) - nTime); 
    // Close DB connection 
    PQfinish(pConn); 

    return nCount; 
} 

我想創建在Java上使用相同名稱的本地方法

public native void Traverser(String path) 

分別traverser.c模塊中會有一個功能

JNIEXPORT void JNICALL Java_ParallelIndexation_Traverser(JNIEnv *env, jobject obj, jstring path) 

的Java_ParallelIndexation_Traverser功能是從traverser.c module.The問題的使用移動功能包裝:如何調用從橫移模塊在Java_ParallelIndexation_Traverser中的traverser.c,傳遞給它參數jstring路徑,從而將它轉換爲一個const char *(簽名Traverser見上)?

+1

所以就是你真正問的問題,如何從傳遞給JNI函數的java jstring參數獲取char *? [This may help](http://stackoverflow.com/questions/4181934/jni-converting-jstring-to-char) – WhozCraig

+1

在SO問題中使用減少的問題/代碼示例更好。它看起來像95%的代碼與您面臨的問題無關。 – millimoose

+0

@WhozCraig,你正確的理解了我。 – user1730626

回答

0

我是否正確理解您的問題:如何實現Java_ParallelIndexation_Traverser以便它調用非託管的Traveser函數?

如果是這樣,這裏的如何:

JNIEXPORT void JNICALL Java_ParallelIndexation_Traverser(JNIEnv* env, jobject obj, jstring path) 
{ 
    const jbyte* path2 = env->GetStringUTFChars(path, nullptr); 
    if (path2 == nullptr) 
     return; 

    ::Traverser(path2); 

    env->ReleaseStringUTFChars(path, path2); 
} 

編輯:

說明:JNIEnv的:: GetStringUTFChars轉換一個的jstring字節數組。然後您需要調用JNIEnv :: ReleaseStringUTFChars來釋放該字節數組。

+0

是什麼意思::和env-> ReleaseStringUTFChars(path,path2); ?請將註釋添加到您的代碼中。 – user1730626

+0

,爲什麼可以調用:: Traverser(path2)其中path2具有jbyte類型*,畢竟long int Traverser(const char * sTraversingRoot)具有其他類型的參數? – user1730626

+0

@ user1730626因爲jbyte只是char的typedef。 – user1610015