Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Передача параметров в native-методе

#eclipse #jni #java #c #cpp


Есть функция на С (модуль 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;
}

Я хочу создать одноименный native-метод на 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 из
модуля traverser.c. Возникает вопрос: как вызвать Traverser из модуля traverser.c в
Java_ParallelIndexation_Traverser, передав ей параметр jstring path, при этом преобразовав
его в const char * (сигнатуру Traverser см. выше)?  
    


Ответы

Ответ 1



Ты что-то замудрил с вопросом, если я правильно тебя понял, попробуй так: JNIEXPORT void JNICALL Java_ParallelIndexation_Traverser(JNIEnv *env, jobject obj, jstring path) { char* cstr = env->GetStringUTFChars(path, NULL); long result = Traverser(cstr) env->ReleaseStringUTFChars(path, cstr); }

Комментариев нет:

Отправить комментарий