1

重複の可能性:
jni が jstring を 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 モジュールの Traverser 関数ラッパーです。問題は、Java_ParallelIndexation_Traverser で Traverser traverser.c からモジュールを呼び出し、パラメータ jstring パスを渡して const char * (signature Traverser上記を参照)?

4

1 に答える 1

0

あなたの質問を正しく理解できましたか: アンマネージ Traveser 関数を呼び出すように Java_ParallelIndexation_Traverser を実装する方法は?

その場合、方法は次のとおりです。

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 を呼び出して、そのバイト配列の割り当てを解除する必要があります。

于 2012-10-20T17:54:01.393 に答える