jni整理
方法命名規則
JNIEXPORT jstring JNICALL Java_com_zkhero_jnitestdemo_JNIUtils_getTopicMsgFromJNI(JNIEnv *env, jclass clazz, jstring topic) ; //JNIEXPORT和JNICALL分別用於在Windows下標明該函數導出在外部可以調用和用於約束函數入棧順序和堆棧清理的規則,在編譯到Linux環境的動態庫時可用省略 //jobect 是方法的返回類型 //函數名的規則是Java_包名_類名_方法名 //方法的形參列表,第一個是JNIEnv *env, 代表的是JNI 函數表指針 //第二個對應的Java方法是實例方法,第二個形參爲 jobject instance,代表的是擁有該Java實例方法的實例。若對應的是Java方法是靜態方法,第二個形參爲jclass cls,代表的是該方法所屬的類
java基礎數據類型的映射(在native中怎麼寫)
typedef uint8_t jboolean; /* unsigned 8 bits 對應java boolean*/ typedef int8_t jbyte; /* signed 8 bits 對應java byte*/ typedef uint16_t jchar; /* unsigned 16 bits 對應java char*/ typedef int16_t jshort; /* signed 16 bits 對應java short*/ typedef int32_t jint; /* signed 32 bits 對應java int*/ typedef int64_t jlong; /* signed 64 bits 對應java long*/ typedef float jfloat; /* 32-bit IEEE 754 對應java float*/ typedef double jdouble; /* 64-bit IEEE 754 對應java double*/
jni返回ArrayList自定義對象list
//本地方法 public static native ArrayList getNodesFromJNI(String topic); //cpp 方法 extern "C" JNIEXPORT jobject JNICALL Java_com_zkhero_jnitestdemo_JNIUtils_getNodesFromJNI(JNIEnv *env, jclass clazz, jstring topic) { jclass cls_ArrayList = env->FindClass("java/util/ArrayList"); jmethodID construct = env->GetMethodID(cls_ArrayList, "<init>", "()V"); jobject obj_ArrayList = env->NewObject(cls_ArrayList, construct, ""); //獲取ArrayList對象的add()的methodID jmethodID arrayList_add = env->GetMethodID(cls_ArrayList, "add", "(Ljava/lang/Object;)Z"); //定義寫死數據返回 char *node[7] = { "/is_lane", "/map_server/Publib/fsfd/RangeData", "/kyber_sim_map_server", "/lane_cam_0", "/lcPriodf/gfdgrityArray", "/lcTargetL/fds/aneArray", "/lka/motion/gd_plan"}; jclass cls_node = env->FindClass("com/huawei/jnitestdemo/NodeInfo"); jmethodID construct_node = env->GetMethodID(cls_node, "<init>", "()V"); int i; for (i = 0; i < 7; i++) { jobject obj_node = env->NewObject(cls_node, construct_node, ""); jfieldID node_name = env->GetFieldID(cls_node, "name", "Ljava/lang/String;"); jfieldID node_topic = env->GetFieldID(cls_node, "topic", "Ljava/lang/String;"); env->SetObjectField(obj_node, node_name, env->NewStringUTF(node[i])); env->SetObjectField(obj_node, node_topic, env->NewStringUTF("topicData")); env->CallObjectMethod(obj_ArrayList, arrayList_add, obj_node); } return obj_ArrayList; }
native層獲取java自定義數據類
//從Java層傳遞NodeInfo對象到Native JNIEXPORT void JNICALL Java_com_zkhero_jnitestdemo_JNIUtils_setCurrentNode(JNIEnv *env, jclass clazz, jobject info) { jclass booCls = env->GetObjectClass(info); //獲得java對象的引用 if(booCls == NULL) { LOGD("book is null"); // 必須要return return; } //env->GetFieldID,該方法能獲取到對象字段的引用,最後一個參數參見上表 jfieldID nameField = env->GetFieldID(booCls,"name","Ljava/lang/String;"); jfieldID yearField = env->GetFieldID(booCls, "year","I"); //env->GetIntField得到字段對應的值 jstring name = (jstring)env->GetObjectField(info, nameField); jint year = env->GetIntField(info, yearField); const char * c_name = env->GetStringUTFChars(name, NULL); LOGD("name:%s", c_name); LOGD("year:%d", year); env->ReleaseStringUTFChars(name, c_name); } /*******nodeinfo對象********/ public class NodeInfo { public String name; public int year; @Override public String toString() { return "NodeInfo{" + "name='" + name + '\'' + ", year='" + year + '\'' + '}' +"\n"; } }
後面繼續新增