Java 如何在C++;使用JNI

Java 如何在C++;使用JNI,java,c++,java-native-interface,Java,C++,Java Native Interface,我需要调用java代码,然后使用jnI返回C++中的字符串。p> 基本上,在C++中,我想使用一个函数,比如“代码>”字符串GETMyString()“< /Cord>”,从java中获取一些字符串。我怎样才能得到它?下面是我的包装器,返回std::wstring。请注意,它使用“关键字符串” C++impl: JNIEXPORT void JNICALL Java_bla_bla_bla_bla_log_1message (JNIEnv *env, jclass, jstring cate

我需要调用java代码,然后使用jnI返回C++中的字符串。p>
<>基本上,在C++中,我想使用一个函数,比如“代码>”字符串GETMyString()“< /Cord>”,从java中获取一些字符串。我怎样才能得到它?

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

C++impl:

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());


        }

您能否举例说明如何定义和初始化用于此用途的特定jmethodID,然后如何使用它调用java函数,然后返回字符串?@rantravee-刚刚添加samples@StockB方法Java_bla_bla_bla_log_1带有参数“category”的消息按您的要求执行。同样的技术也可以用于返回值。签名将是
jstring Java_bla_bla_bla_bla_log_1message
std::string的可能副本,请查看此处:-此外,确保将
std::string
转换为
char*
-
std::string str=“string”;const char*cstr=str.c_str()
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);
}
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());


        }