JNIは複雑なオブジェクトの1つを返します
3624 ワード
必要:
まず需要を言って、最近1つのプロジェクトを引き継いで、下層でバイナリデータを解析して、データ構造は比較的に責任を持って、サーバーはc++サーバーで、その上モバイル端の開発を考慮していないので、プロトコルは少しでたらめです!大体そうですが、1つのパケットの中にはmapの中にvectorを入れてシーケンス化してバイナリにします!iosのほうがいいです.object-c自体はc++をサポートしています.簡単にパッケージすればいいです.androidのほうはちょっと面倒です.javaのデータフォーマットに変える必要があります.問題が来ました.c++のデータインタフェースは大体こうです.
std::map<:string info="">> tmep;
質問:
Javaのデータオブジェクトに変換するには、インターネットで検索してみましたが、この方面の資料はありません.基本的には簡単なオブジェクトが戻ってきます.こんなに複雑ではありません.できません.自分でやりました.私のやり方はこうです.
Javaでオブジェクトクラスを宣言します.次のようにします.
jniによってこのオブジェクトを返します.jniのコードは次のとおりです.
まず需要を言って、最近1つのプロジェクトを引き継いで、下層でバイナリデータを解析して、データ構造は比較的に責任を持って、サーバーはc++サーバーで、その上モバイル端の開発を考慮していないので、プロトコルは少しでたらめです!大体そうですが、1つのパケットの中にはmapの中にvectorを入れてシーケンス化してバイナリにします!iosのほうがいいです.object-c自体はc++をサポートしています.簡単にパッケージすればいいです.androidのほうはちょっと面倒です.javaのデータフォーマットに変える必要があります.問題が来ました.c++のデータインタフェースは大体こうです.
std::map<:string info="">> tmep;
質問:
Javaのデータオブジェクトに変換するには、インターネットで検索してみましたが、この方面の資料はありません.基本的には簡単なオブジェクトが戻ってきます.こんなに複雑ではありません.できません.自分でやりました.私のやり方はこうです.
Javaでオブジェクトクラスを宣言します.次のようにします.
public class ControlDictionaryValue {
public String value;
}
public class LoginMsg extends BaseMsg {
//
public HashMap > controlDictionary;
}
jniによってこのオブジェクトを返します.jniのコードは次のとおりです.
JNIEXPORT jobject JNICALL Java_com_example_filltriangle_GL2JNILib_test(JNIEnv* env, jclass tis)
{
jclass m_login_msg = env->FindClass("hzcw/msgdata/LoginMsg");
jmethodID m_method_login_msg_init = env->GetMethodID(m_login_msg,"","()V");
jobject m_login_msg_obj = env->NewObject(m_login_msg, m_method_login_msg_init);
jfieldID m_fid_controlDictionary = env->GetFieldID(m_login_msg,"controlDictionary","Ljava/util/HashMap;");
// new hashmap
jclass class_hashmap=env->FindClass("java/util/HashMap");
jmethodID hashmap_construct_method=env->GetMethodID(class_hashmap, "","()V");
jobject obj_hashmap =env->NewObject(class_hashmap, hashmap_construct_method, "");
jmethodID hashmap_put_method= env->GetMethodID(class_hashmap,"put","(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
// new ArrayList
jclass class_arraylist=env->FindClass("java/util/ArrayList");
jmethodID arraylist_construct_method=env->GetMethodID(class_arraylist, "","()V");
jobject obj_arraylist =env->NewObject(class_arraylist, arraylist_construct_method, "");
jmethodID arraylist_add_method= env->GetMethodID(class_arraylist,"add","(Ljava/lang/Object;)Z");
// new ControlDictionaryValue
jclass m_cls_ControlDictionaryValue = env->FindClass("hzcw/datastruct/ControlDictionaryValue");
jmethodID m_mid_ControlDictionaryValue = env->GetMethodID(m_cls_ControlDictionaryValue,"","()V");
jobject m_obj_ControlDictionaryValue = env->NewObject(m_cls_ControlDictionaryValue, m_mid_ControlDictionaryValue, "");
// ControlDictionaryValue value
jfieldID m_fid_ControlDictionaryValue_value = env->GetFieldID(m_cls_ControlDictionaryValue,"value","Ljava/lang/String;");
env->SetObjectField(m_obj_ControlDictionaryValue,m_fid_ControlDictionaryValue_value,env->NewStringUTF(" "));
env->CallBooleanMethod(obj_arraylist, arraylist_add_method, m_obj_ControlDictionaryValue);
env->CallObjectMethod(obj_hashmap,hashmap_put_method,env->NewStringUTF((char*)" "), obj_arraylist);
env->SetObjectField(m_login_msg_obj,m_fid_controlDictionary,obj_hashmap);
env->DeleteLocalRef(m_obj_ControlDictionaryValue); //
env->DeleteLocalRef(obj_arraylist); //
env->DeleteLocalRef(obj_hashmap); //
return m_login_msg_obj;
}
以上これは偽のデータで、真実のデータは自分で埋めて、開発の一目でわかることをします!