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