Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将JNIC代码中的jstring发送到接收字符串作为参数的java函数_Java_C_String_Java Native Interface - Fatal编程技术网

将JNIC代码中的jstring发送到接收字符串作为参数的java函数

将JNIC代码中的jstring发送到接收字符串作为参数的java函数,java,c,string,java-native-interface,Java,C,String,Java Native Interface,如何将JNIC代码中的jstring发送到作为参数接收字符串的Java函数 我已经读过一些函数,比如callVoidMethodA(..),但是它们不接受任何函数,比如jstring,您没有提到目标类名和目标方法签名。所以,例如,方法, JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj) { char *buf = "Hi !!!!"; jstring jString = (*e

如何将JNI
C
代码中的
jstring
发送到作为参数接收
字符串的
Java
函数


我已经读过一些函数,比如
callVoidMethodA(..)
,但是它们不接受任何函数,比如
jstring

,您没有提到目标类名和目标方法签名。所以,例如,方法,

JNIEXPORT jstring JNICALL 
 Java_Prompt_getLine(JNIEnv *env, jobject obj)
 {
     char *buf = "Hi !!!!";
     jstring jString = (*env)->NewStringUTF(env, buf);
     free(buf);
     return jString;
 }
现在需要类名和方法签名(根据)

要从JNI代码调用java方法,您应该获得
jmethodID

static jclass StringBuilder_Class = 0;
static jmethodID StringBuilder_append_Method = 0;

void Init( JNIEnv* env )
{
     if( StringBuilder_Class == 0 ) {
         StringBuilder_Class = (*env)->FindClass( env, StringBuilder_ClassName );
         // TODO: Handle error if class not found
     }
     if( StringBuilder_append_Method == 0 ) {
         StringBuilder_append_Method = (*env)->GetMethodID( env, StringBuilder_Class,
             StringBuilder_append_MethodName, StringBuilder_append_MethodSignature );
         // TODO: Handle error if method not found
     }
}

void foo( JNIEnv* env, jobject obj )
{
    Init();
    char* str;
    // str = ...;
    jstring jString = (*env)->NewStringUTF( env, str );
    // Because StringBuild.append() returns object, you should call CallObjectMethod
    jobject ret = (*env)->CallObjectMethod( env, obj, jString );
    // Here you can release local references, i.e.
    // (*env)->DeleteLocalRef( env, ret );
    // (*env)->DeleteLocalRef( env, jString );
    // But it is not necessary. Local references are released automatically when
    // thread returns from JNI code to Java code.
    // So you can ignore the returned value and not to release the jString local
    // reference, i.e. just call
    // (*env)->CallObjectMethod( env, obj, jString );
}

我想把它作为一个论点,如问题所述
static char const StringBuilder_ClassName = "java/lang/StringBuilder";
static char const StringBuilder_append_MethodName = "append";
static char const StringBuilder_append_MethodSignature =
    "(Ljava/lang/String;)Ljava/lang/StringBuilder;";
static jclass StringBuilder_Class = 0;
static jmethodID StringBuilder_append_Method = 0;

void Init( JNIEnv* env )
{
     if( StringBuilder_Class == 0 ) {
         StringBuilder_Class = (*env)->FindClass( env, StringBuilder_ClassName );
         // TODO: Handle error if class not found
     }
     if( StringBuilder_append_Method == 0 ) {
         StringBuilder_append_Method = (*env)->GetMethodID( env, StringBuilder_Class,
             StringBuilder_append_MethodName, StringBuilder_append_MethodSignature );
         // TODO: Handle error if method not found
     }
}

void foo( JNIEnv* env, jobject obj )
{
    Init();
    char* str;
    // str = ...;
    jstring jString = (*env)->NewStringUTF( env, str );
    // Because StringBuild.append() returns object, you should call CallObjectMethod
    jobject ret = (*env)->CallObjectMethod( env, obj, jString );
    // Here you can release local references, i.e.
    // (*env)->DeleteLocalRef( env, ret );
    // (*env)->DeleteLocalRef( env, jString );
    // But it is not necessary. Local references are released automatically when
    // thread returns from JNI code to Java code.
    // So you can ignore the returned value and not to release the jString local
    // reference, i.e. just call
    // (*env)->CallObjectMethod( env, obj, jString );
}