参数通过本机方法
Parameter passing in native a method
可能的重复:
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来处理该字节阵列。
相关文章:
- 在nodejs中使用本机代码的最佳方法是什么?
- 多次调用本机方法时出现致命错误
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 努力使用 C# 从本机 DLL 调用该方法
- 在 C++/CLI 中从本机转换为管理无符号短的最快方法
- Android 无法从本机代码调用 Java 方法 JNI
- 将本机方法添加到 OpenJDK 源代码
- 如何将类对象传递给 jni 本机方法
- 有什么方法可以用本机C 代码替换Windows API计时器(settimer)
- 将 C++/CLI 对象指针传递给本机对象方法
- JNI 本机静态方法拦截
- 操作方法:将 boost::endian 缓冲区类型转换回本机格式
- 如何传递InteropServices.ComTypes.IStream到接受IStream*的本机方法,使用c++/c
- 如何在本机回调中使用Cython CDEF类成员方法
- 是在DEX文件方法计数中计数的本机C 方法
- 从java调用本机方法时使用Libc SIGSEGV
- 本机方法中的不满意的Linkerror
- Windows Service 无法调用 C++ 本机方法 [DllImpor( "myDLL" )]
- 参数通过本机方法
- 无法调用本机方法 Eclipse