JNI——结构体(即java中的类)的传入与设置——NativeMethod映射表
            时间:2014-05-09 00:10:19  
            收藏:0  
            阅读:687
        
        
        参考:http://www.cnblogs.com/skywang12345/archive/2013/05/26/3093593.html
java 类:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | packagecom.skywang.ndk;publicclassMyInfo {    privateString  mName;                         privateintmAge;    privatefloatmHeight;        publicString toString(){        return"mName:"+mName+", mAge:"+mAge+", mHeight:"+mHeight;    }}============================================Person.java: packagecom.skywang.ndk;publicclassPerson {        privateString  mName;                         privateintmAge;    privatefloatmHeight;        publicString toString(){        return"mName:"+mName+", mAge:"+mAge+", mHeight:"+mHeight;    }} | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | packagecom.skywang.ndk;importandroid.app.Activity;importandroid.os.Bundle;importandroid.util.Log;publicclassNdkParam extendsActivity {    publicstaticfinalString TAG="skywang--NdkParam";    publicstaticfinalString TAG_MY="MY_skywang--NdkParam";    /** Called when the activity is first created. */    privatePerson person=null;    privateMyInfo myinfo = null;            @Override    publicvoidonCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                Log.d(TAG, "on create.");        person = newPerson();        for(inti=0; i<3; i++) {            getPersonInfoByIndex(person, i);            Log.d(TAG, "person["+i+"] -- "+person);        }                Log.d(TAG, "==============================》MyInfo.《==================================");        myinfo = newMyInfo();        for(inti=0; i<3; i++) {                        getMyInfoByIndex(myinfo, i);            Log.d(TAG, "myinfo["+i+"] -- "+myinfo);        }    }        // jni    privatenativeintgetPersonInfoByIndex(Person person, intindex);    privatenativeintgetMyInfoByIndex(MyInfo myinfo, intindex);    static{        //System.loadLibrary("ndk_param");        System.loadLibrary("ndk_param");    }} | 
JNI:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | 头文件:#include <stdlib.h>#include <string.h>#include <stdio.h>#include <jni.h>#include <assert.h>// 获取数组的大小# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))// 指定要注册的类,对应完整的java类名#define JNIREG_CLASS "com/skywang/ndk/NdkParam"#define JNIPAR_CLASS "com/skywang/ndk/Person"#define JNIPAR_CLASS_MYINFO "com/skywang/ndk/MyInfo"// 引入log头文件#include <android/log.h>  // log标签#define  TAG    "hello_param"// 定义info信息#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)// 定义debug信息#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)// 定义error信息#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)// jfieldID结构体,用于保存类“Person.java”的filedIDstructPersonOffsets{    jfieldID    name;    jfieldID    age;    jfieldID    height;} gPersonOffsets;structMyInfoOffsets{    jfieldID    name;    jfieldID    age;    jfieldID    height;} gMyInfoOffsets;// 与“Person.java”对应的结构体,用于保存数据,并将数据赋值给Person.java的成员typedefstructtagPerson{    charmName[10];    intmAge;    floatmHeight;}Person;typedefstructtagMyInfo{    charmName[10];    intmAge;    floatmHeight;}MyInfo;// 定义了3个PersonstaticPerson gPersons[] = {    {"skywang", 25, 175},    {"eman", 30, 166},    {"Dan", 51, 172},};staticMyInfo gMyInfos[] = {    {"liu", 25, 175},    {"gang", 30, 166},    {"hong", 51, 172},};#define GPERSON_NUM NELEM(gPersons)#define GMYINFO_NUM NELEM(gMyInfos) | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | c文件:#include "ndk_param.h"/*  * 根据index获取Person信息。 * 参数说明: *      env : JNI 接口指针。 *      claszz : Java 类对象。 *      person : 输入参数,java对象 *      index : 输入参数,序列号。 */JNIEXPORT jint JNICALL getPersonInfoByIndex(JNIEnv *env, jobject clazz, jobject person, jint index){    // 若index无效,则直接返回-1。    if((int)index<0 || (int)index>=GPERSON_NUM)        return-1;    // 将Person数组(gPersons)中的第index个成员赋值给pPerson指针    Person *pPerson = &gPersons[index];            // 设置java对象person的mName    jstring name = (*env)->NewStringUTF(env, pPerson->mName);    (*env)->SetObjectField(env, person, gPersonOffsets.name, name);    // 设置java对象person的mAge    (*env)->SetIntField(env, person, gPersonOffsets.age, pPerson->mAge);    // 设置java对象person的mHeight    (*env)->SetFloatField(env, person, gPersonOffsets.height, pPerson->mHeight);    LOGD("%s index-%d  mName:%s, mAge:%d, mHeight:%f\n",             __func__, index, pPerson->mName, pPerson->mAge, pPerson->mHeight);    return0;}JNIEXPORT jint JNICALL getMyInfoByIndex(JNIEnv *env, jobject clazz, jobject myinfo, jint index){    // 若index无效,则直接返回-1。    if((int)index<0 || (int)index>=GMYINFO_NUM)        return-1;        // 将Person数组(gPersons)中的第index个成员赋值给pPerson指针    MyInfo *pMyInfo = &gMyInfos[index];        // 设置java对象person的mName    jstring name = (*env)->NewStringUTF(env, pMyInfo->mName);    (*env)->SetObjectField(env, myinfo, gMyInfoOffsets.name, name);        // 设置java对象person的mAge    (*env)->SetIntField(env, myinfo, gMyInfoOffsets.age, pMyInfo->mAge);    // 设置java对象person的mHeight    (*env)->SetFloatField(env, myinfo, gMyInfoOffsets.height, pMyInfo->mHeight);    LOGD("%s index-%d  mName:%s, mAge:%d, mHeight:%f\n",             __func__, index, pMyInfo->mName, pMyInfo->mAge, pMyInfo->mHeight);    return0;}// 初始化函数,用于获取Java中各个成员对应的fieldID。staticvoidnativeClassInit (JNIEnv *env){       jclass personClass = (*env)->FindClass(env, JNIPAR_CLASS);     jclass myinfoClass = (*env)->FindClass(env, JNIPAR_CLASS_MYINFO);        // 获取Person的mName成员对应的FieldID,并保存到gPersonOffsets中    gPersonOffsets.name     = (*env)->GetFieldID(env, personClass, "mName", "Ljava/lang/String;");     gMyInfoOffsets.name     = (*env)->GetFieldID(env, myinfoClass, "mName", "Ljava/lang/String;");             // 获取Person的mAge成员对应的FieldID,并保存到gPersonOffsets中    gPersonOffsets.age      = (*env)->GetFieldID(env, personClass, "mAge", "I");    gMyInfoOffsets.age      = (*env)->GetFieldID(env, myinfoClass, "mAge", "I");            // 获取Person的mHeight成员对应的FieldID,并保存到gPersonOffsets中    gPersonOffsets.height   = (*env)->GetFieldID(env, personClass, "mHeight", "F");    gMyInfoOffsets.height   = (*env)->GetFieldID(env, myinfoClass, "mHeight", "F");}// Java和JNI函数的绑定表staticJNINativeMethod method_table[] = {    { "getPersonInfoByIndex", "(Lcom/skywang/ndk/Person;I)I", (void*)getPersonInfoByIndex },//绑定    { "getMyInfoByIndex", "(Lcom/skywang/ndk/MyInfo;I)I", (void*)getMyInfoByIndex },//绑定    };// 注册native方法到java中staticintregisterNativeMethods(JNIEnv* env, constchar* className,        JNINativeMethod* gMethods, intnumMethods){    jclass clazz;    clazz = (*env)->FindClass(env, className);    if(clazz == NULL) {        returnJNI_FALSE;    }    if((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) {        returnJNI_FALSE;    }    returnJNI_TRUE;}intregister_ndk_param(JNIEnv *env){    nativeClassInit(env);    // 调用注册方法    returnregisterNativeMethods(env, JNIREG_CLASS,            method_table, NELEM(method_table));}// JNI_OnLoad在jni注册时,会被回调执行。JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){    JNIEnv* env = NULL;    jint result = -1;     if((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {        returnresult;    }       register_ndk_param(env);    // 返回jni的版本    returnJNI_VERSION_1_4;} | 
            评论(0)
        
        
        