如何發送jstring
從JNI C
代碼到Java
函數接收String
作爲參數?將jstring從jni c代碼發送到接收字符串作爲參數的java函數
我已閱讀有關callVoidMethodA(....)
等功能,但他們不接受任何內容,如jstring
。
如何發送jstring
從JNI C
代碼到Java
函數接收String
作爲參數?將jstring從jni c代碼發送到接收字符串作爲參數的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;
}
您還沒有提到目標類名稱和目標方法簽名。因此請考慮,例如,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);
}
我想送這是一個如問題所述的論點 – saplingPro