2010-12-02 4 views
2

Мне нужно вызвать код java, а затем вернуть String из C++ с помощью JNI.Как вернуть строку java в C++ с помощью JNI

В основном в C++ Я хочу использовать такую ​​функцию, как "String getMyString()", чтобы получить некоторую строку из java. Как я могу это получить?

+0

дубликата http://stackoverflow.com/questions/4359453/calling-a-java-function-from-c-via-jni- that-returns-a-string – 2014-03-20 15:48:13

ответ

0

Следуйте за моей оболочкой, чтобы вернуть 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()); 


     } 
+1

Не могли бы вы показать пример того, как определить и инициализировать конкретный jmethodID для этого использования, затем как использовать его для вызова функции java, а затем для возврата строки? – rantravee 2010-12-02 15:00:45

Смежные вопросы