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

Возможный дубликат:
JNI конвертирует JSTRING в ЧАР *

На С есть функция (модуль 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 из модуля traverser.c. Вопрос в следующем: как вызвать модуль из Traverser traverser.c в Java_ParallelIndexation_Traverser, передав ему параметр jstring path, преобразовав его в const char * (сигнатура Traverser смотри выше)

1

Решение

Правильно ли я понял ваш вопрос: как реализовать 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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]