一、进行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; }
四、运行得到的结果