如何以定义明确的线程安全方式将 C++ 字符串传递给 Java JNI?
How to pass a C++ string to Java JNI in a well defined thread-safe way?
有一个 C++ 函数,通过 JNI 从 Java 代码中调用。
我想将底层 c 字符串正确传递给 Java,所以我做了以下安排:
// main.cpp
string global;
const char* data () // Called externally by JNI
{
return (global = func_returning_string()).data(); // `.data()` = `.c_str()`
}
但在这种情况下,函数 data()
不再是线程安全的。
在传递字符串时实现线程安全而不导致任何未定义行为的最佳方法是什么?
I want to pass the underlying c-string to the Java correctly
如何将 C++ 字符串传递给 java?您不能将裸露的 c++ 指针传递给 java,您应该为此使用 jni 函数,即:
jstring jstr = (*env)->NewStringUTF(env, data());
然后将jstr传递给java,或者以java数组的形式传递。此函数复制字符串,因此线程安全没有问题。
如果你想在 java 和 c++ 之间共享内存区域,那么你可以尝试使用以下 jni 函数:NewDirectByteBuffer、GetDirectBufferAddress、GetDirectBufferCapacity。
有一个 C++ 函数,通过 JNI 从 Java 代码中调用。
我想将底层 c 字符串正确传递给 Java,所以我做了以下安排:
// main.cpp
string global;
const char* data () // Called externally by JNI
{
return (global = func_returning_string()).data(); // `.data()` = `.c_str()`
}
但在这种情况下,函数 data()
不再是线程安全的。
在传递字符串时实现线程安全而不导致任何未定义行为的最佳方法是什么?
I want to pass the underlying c-string to the Java correctly
如何将 C++ 字符串传递给 java?您不能将裸露的 c++ 指针传递给 java,您应该为此使用 jni 函数,即:
jstring jstr = (*env)->NewStringUTF(env, data());
然后将jstr传递给java,或者以java数组的形式传递。此函数复制字符串,因此线程安全没有问题。
如果你想在 java 和 c++ 之间共享内存区域,那么你可以尝试使用以下 jni 函数:NewDirectByteBuffer、GetDirectBufferAddress、GetDirectBufferCapacity。