gpt4 book ai didi

java - JNI 将字符串从 java 传递到 c++,然后将 c++ 字符串传递给字符串数组

转载 作者:行者123 更新时间:2023-11-30 05:04:36 28 4
gpt4 key购买 nike

我在 java 中声明了本地方法。

static
{
// Replace "Myfile" with the name of your Native File
System.loadLibrary("JohnnyX");
}

// Declare your native methods here
public static native String string(StringBuffer sb);

并将一个字符串缓冲区传递给它。

System.out.println(string(sb));

在我的 JohnnyX.cpp 中,我使用以下方法将 java 字符串转换为 c++ 字符串。

std::string jstring2string(JNIEnv *env, jstring jStr) 
{
if (!jStr)
return "";

const jclass stringClass = env->GetObjectClass(jStr);
const jmethodID getBytes = env->GetMethodID(stringClass, "getBytes", "(Ljava/lang/String;)[B");
const jbyteArray stringJbytes = (jbyteArray) env->CallObjectMethod(jStr, getBytes,
env->NewStringUTF("UTF-8"));

size_t length = (size_t) env->GetArrayLength(stringJbytes);
jbyte *pBytes = env->GetByteArrayElements(stringJbytes, NULL);

std::string ret = std::string((char *) pBytes, length);
env->ReleaseByteArrayElements(stringJbytes, pBytes, JNI_ABORT);

env->DeleteLocalRef(stringJbytes);
env->DeleteLocalRef(stringClass);
return ret;
}

extern "C" JNIEXPORT jstring JNICALL Java_com_example_rsolver_Solver_string(JNIEnv *env, jobject object,jstring string) {
// Converting Java String into C++ String and calling a "solution" method and passing c++ string
return solution(jstring2string(env,string));
}

我的解决方法是:

string solution (string argv[]) {
// this will return a string
}

我的问题是如何将 C++ 字符串传递给解决方案 (string argv[]) 中的字符串数组?

最佳答案

一个简单的解决方案是临时字符串对象

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_rsolver_Solver_string(JNIEnv *env, jobject object,jstring string) {
// Converting Java String into C++ String and
// calling a "solution" method and passing c++ string
std::string tmp{jstring2string(env,string)};
return solution(&tmp);
}

这为解决方案 提供了一个包含 1 个元素的数组。但是 solution() 不知道这个数组有多少个元素,所以你必须加上数组大小

std::string solution (int size, std::string argv[]) {
// this will return a string
}

// ...
std::string tmp{jstring2string(env, string)};
return solution(1, &tmp);

更好的是,跳过原始数组,并传递 std::strings 的 std::vector

std::string solution (const std::vector<std::string> &argv) {
// this will return a string
}

// ...
std::vector<std::string> tmp = { jstring2string(env, string) };
return solution(tmp);

关于java - JNI 将字符串从 java 传递到 c++,然后将 c++ 字符串传递给字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48786491/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com