gpt4 book ai didi

java - 如何使用 JNI 在 C++ 中返回 java 字符串

转载 作者:太空狗 更新时间:2023-10-29 23:20:05 30 4
gpt4 key购买 nike

我需要调用我的 java 代码,然后使用 JNI 从 C++ 返回一个字符串。

基本上在 C++ 中,我想使用像 "String getMyString()" 这样的函数从 java 中获取一些字符串。我怎样才能得到这个?

最佳答案

以下是我返回 std::wstring 的包装器。请注意,它使用“关键字符串”

/**
* Wraps Get/ReleaseStringCritical pairs of unicode java-string
*/
struct jniCriticalString
{
jniCriticalString(JNIEnv *env, jstring str):
_env(env),
_str(str)
{
_pstr = _env->GetStringCritical(_str, &_is_copy);
}
~jniCriticalString()
{
if( _pstr != NULL )
{
_env->ReleaseStringCritical(_str, _pstr);
}
}
/**
* True, if wrapped string is valid - e.g. call of GetStringCritical returned valid value
*/
bool is_valid() const
{
return _pstr != NULL;
}
/** True when GetStringCritical created copy instead of direct pointer */
bool is_copy() const
{
return _is_copy == JNI_TRUE;
}
/** Return unicode NOT NULL TERMINATED! string.*/
const wchar_t* c_str() const
{
return reinterpret_cast<const wchar_t*>( _pstr );
}
/** Get the length of internal string */
jsize length() const
{
return _env->GetStringLength(_str);
}
std::wstring as_string() const
{
return std::wstring(c_str(), length());
}
operator std::wstring () const
{
return as_string();
}

private:
JNIEnv *_env;
jstring _str;
jboolean _is_copy;
const jchar *_pstr;
};

已更新

以下代码使用字符串作为输入参数:

Java代码:

private static native void log_message(
String category, String message, int level);

C++ 实现:

JNIEXPORT void JNICALL Java_bla_bla_bla_bla_log_1message
(JNIEnv *env, jclass, jstring category, jstring message, jint level)
{
jniCriticalString pCat(env, category);
if( !pCat.is_valid() )
return;
jniCriticalString pMsg(env, message);
if( !pMsg.is_valid() )
return;

std::wstring lCat(pCat.c_str(), pCat.length());
std::wstring lmessage(pMsg.c_str(), pMsg.length());
OP::Logging::instance().log_message(lCat, lmessage, (OP::Logging::LogLevel)level);
}

返回字符串的 C++ 方法使用了另一种技术:

Java_bla_bla_bla_getName(
JNIEnv *env, jclass operationClass, jlong handler )
{
std::wstring retval = ...
//.. code to resolve std::wstring

return env->NewString(
(const jchar*)retval.c_str(),
(jsize)retval.length());


}

关于java - 如何使用 JNI 在 C++ 中返回 java 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4336245/

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