参数通过本机方法

Parameter passing in native a method

本文关键字:方法 本机 参数      更新时间:2023-10-16

可能的重复:
JNI将Jstring转换为char *

st上有一个函数(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 connectn");
        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调用模块(签名Traverser见上文)?

我是否正确理解了您的问题:如何实现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 ::发行释放flatefchars来处理该字节阵列。