如何以定义良好的线程安全方式将C++字符串传递给Java JNI

How to pass a C++ string to Java JNI in a well defined thread-safe way?

本文关键字:字符串 C++ JNI Java 方式 安全 定义 线程      更新时间:2023-10-16

有一个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()不再是线程安全的
在传递字符串时,在不引起任何未定义行为的情况下,实现线程安全的最佳方法是什么?

我想将底层的c字符串正确地传递给Java

您是如何将c++字符串传递给java的?您不能将裸露的C++指针传递给Java,您应该使用JNI函数,即:

jstring jstr = (*env)->NewStringUTF(env, data());

然后将jstr传递给Java或者以Java数组的形式传递。此函数重复字符串,因此线程安全性没有问题。

如果您想在Java和C++之间共享内存区域,那么您可以尝试使用以下JNI函数:NewDirectByteBufferGetDirectBufferAddressGetDirectBufferCapacity