简体   繁体   English

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

[英]How to return a java string in C++ using JNI

I need to call my java code and then return a String from C++ using JNI.我需要调用我的 java 代码,然后使用 JNI 从 C++ 返回一个字符串。

Basically in C++ I want to use a function like "String getMyString()" to obtain some string from java.基本上在 C++ 中,我想使用像"String getMyString()"这样的函数从 java 获取一些字符串。 How could I obtain this ?我怎么能得到这个?

Follow is my wrapper to return std::wstring. Follow 是我返回 std::wstring 的包装器。 Note that it is uses "critical string"请注意,它使用“关键字符串”

/**
*   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;
};

UPDATED更新

Following code uses string as input parameter:以下代码使用字符串作为输入参数:

JAVA code:爪哇代码:

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

C++ impl: 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++ method to return string uses little bit another technique:返回字符串的 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());


        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM