.so 将c++转化为安卓可使用的数据

166 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

jclass objClass = mJni->FindClass("结构类型"); 定义数组中元素类型

如果传入的是数组,需要知道它的大小并进行循环

int nsize = myArray.size();

 

创建一个数组对象,里面的每个元素用 objClass元素表示(FindClass 所对应的类型)

数组为空 不再进行下面的操作


jobjectArray texts = mJni->NewObjectArray(nsize, objClass, NULL);

if (texts == nullptr) {

    Log_Changer("<so::TryOperateCallBackToJava> undispose");

    return;

}

 


jmethodID method_set_taskId = mJni->GetMethodID(objClass, "setNextTaskId", "(Ljava/lang/String;)V");

jmethodID Event = mJni->GetMethodID(objClass, "<init>", "()V");

Event 是用来获取构造方法

 

GetMethodID 是用来 获取java 类中方法的ID  最后一个参数是他的类型

String :"(Ljava/lang/String;)V"

Int  :"(I)V"

Bool :"(Z)V"

如果这里获取的是一个数据结构  最后一个参数是他的结构类型 仿照jclass最后一个参数

 

jobject objmodel = mJni->NewObject(objClass, method_init_Event, "");

new 一个object  存储它的内容  第一个参数为他的jclass  第二个是他的构造函数

 

 

字符串的转化比较特别 一定要使用下面的格式 否则会出错的

 if (str != "") {

        jstring jname = mJni->NewStringUTF(str.c_str());

        mJni->CallVoidMethod(objmodel, method_set_taskId, jname);
    }

    CallVoidMethod   适用于将数据存储到 objmodel
大家都是一样的存储方法  但是第二第三个参数要对应

 

jclass cls;

jmethodID mid;
cls = mJni->GetObjectClass(mThiz);

GetObjectClass(,"")  支持两个参数查询  他所检索的类 不知道类名 并且第二个参数是object
mid = mJni->GetMethodID(cls, "TryOperateAndroidBack", "([Lcn/jucheng/mise/model/java2so/event/operateTimerDelayEvent;Z)V");

这句一定要记得写  第二个参数是安卓端的函数名 一档不能错 第三个参数为 这个函数的参数值  并且需要与下面的参数保持一致

  mJni->CallVoidMethod(mThiz, mid, texts, bres);

  前两个为固定参数 后面的是与上面的第三个参数的类型以及位置保持一致

这只是初学者的代码 有不对得地方恳请大家 多多指教!