参数传递本机方法

可能重复:
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 path,从而将其转换为const char *(签名Traverser)往上看)?

我是否正确理解了您的问题:如何实现Java_ParallelIndexation_Traverser以便它调用非托管Traveserfunction?

如果是这样,这是如何:

 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); } 

编辑:

Explanation:JNIEnv :: GetStringUTFChars将jstring转换为字节数组。 然后,您需要调用JNIEnv :: ReleaseStringUTFChars来释放该字节数组。