2012-10-13 21 views

回答

1
JNIEXPORT jstring JNICALL 
Java_Prompt_getLine(JNIEnv *env, jobject obj) 
{ 
    char *buf = "Hi !!!!"; 
    jstring jString = (*env)->NewStringUTF(env, buf); 
    free(buf); 
    return jString; 
} 
+0

我想送這是一個如問題所述的論點 – saplingPro

3

您還沒有提到目標類名稱和目標方法簽名。因此請考慮,例如,java.lang.StringBuilder.append(java.lang.String)方法。

// First lets assume you have already received the next variables 
void foo(JNIEnv* env, jobject obj) 
{ 
    // Call StringBuilder.append() method 
} 

現在,你需要(根據docs

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;"; 

撥叫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); 
} 
相關問題