JNI C++呼叫Java返回物件,傳遞自定義物件引數(五)
阿新 • • 發佈:2021-01-13
技術標籤:AndroidJNI傳物件C++呼叫Java 傳遞物件
一、進行Java方法定義:
public native User testObjectParam(); public void testUserParam(User user){ Log.e(TAG, "C++呼叫Java " + user.toString()); }
二、建一個類和方法
package com.example.jnidemo; import android.util.Log; public class User { private String name; private int age; public void setNameAndAge(String name,int age){ Log.e("TAG","被呼叫了"+name+age); this.name = name; this.age = age; } public String getNameAndAge(){ return name+" "+ age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
三、進行C++函式對Java方法呼叫
void testParamUser(JNIEnv *env, jobject thiz){ //步驟1:通過路徑找到對應的類 jclass user_clazz = env->FindClass("com/example/jnidemo/User"); //步驟2:獲取方法名稱ID jmethodID method_init_id = env->GetMethodID(user_clazz,"<init>","()V");//拿到構造方法 jmethodID method_set_id = env->GetMethodID(user_clazz,"setNameAndAge", "(Ljava/lang/String;I)V");//拿到構造方法 jmethodID method_get_id = env->GetMethodID(user_clazz,"getNameAndAge", "()Ljava/lang/String;");//拿到構造方法 //步驟3: //建立了User物件 jobject user_obj = env->NewObject(user_clazz,method_init_id); string name = "使用者"; jstring jname = env->NewStringUTF(name.c_str()); //步驟4:呼叫相應的方法 env->CallVoidMethod(user_obj,method_set_id,jname,21);//set函式沒返回值 //呼叫方法 jstring result = (jstring) env->CallObjectMethod(user_obj, method_get_id); // LOGD("result:%s",jstring2str(env,result).c_str()); LOGD("JniNative返回資料:%s",jstring2string(env,result).c_str()); jclass jclazz = env->GetObjectClass(thiz); /** * 獲取java物件方法ID * clazz:物件類 * name:方法名 * sig:方法簽名 */ jmethodID jmethodID = env->GetMethodID(jclazz, "testUserParam", "(Lcom/example/jnidemo/User;)V"); env->CallVoidMethod(thiz, jmethodID,user_obj); } extern "C" JNIEXPORT jobject JNICALL Java_com_example_jnidemo_JniNative_testObjectParam(JNIEnv *env, jobject thiz) { // TODO: implement testObjectParam() //步驟1:通過路徑找到對應的類 jclass user_clazz = env->FindClass("com/example/jnidemo/User"); //步驟2:獲取方法名稱ID jmethodID method_init_id = env->GetMethodID(user_clazz,"<init>","()V");//拿到構造方法 jmethodID method_set_id = env->GetMethodID(user_clazz,"setNameAndAge", "(Ljava/lang/String;I)V");//拿到構造方法 jmethodID method_get_id = env->GetMethodID(user_clazz,"getNameAndAge", "()Ljava/lang/String;");//拿到構造方法 //步驟3: //建立了User物件 jobject user_obj = env->NewObject(user_clazz,method_init_id); string name = "使用者"; jstring jname = env->NewStringUTF(name.c_str()); //步驟4:呼叫相應的方法 env->CallVoidMethod(user_obj,method_set_id,jname,21);//set函式沒返回值 //呼叫方法 jstring result = (jstring) env->CallObjectMethod(user_obj, method_get_id); return user_obj; }
四、執行得到的結果