java jni 结构体_JNI——结构体(即java中的类)的传入与设置——NativeMethod映射表...

参考:http://www.cnblogs.com/skywang12345/archive/2013/05/26/3093593.html

http://www.2cto.com/kf/201501/372701.html

java 类:

package com.skywang.ndk;

public class MyInfo {

private String mName;

private int mAge;

private float mHeight;

public String toString(){

return "mName:"+mName+", mAge:"+mAge+", mHeight:"+mHeight;

}

}

============================================

Person.java:

package com.skywang.ndk;

public class Person {

private String mName;

private int mAge;

private float mHeight;

public String toString(){

return "mName:"+mName+", mAge:"+mAge+", mHeight:"+mHeight;

}

}

package com.skywang.ndk;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

public class NdkParam extends Activity {

public static final String TAG="skywang--NdkParam";

public static final String TAG_MY="MY_skywang--NdkParam";

/** Called when the activity is first created. */

private Person person=null;

private MyInfo myinfo = null;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Log.d(TAG, "on create.");

person = new Person();

for (int i=0; i<3; i++) {

getPersonInfoByIndex(person, i);

Log.d(TAG, "person["+i+"] -- "+person);

}

Log.d(TAG, "==============================》MyInfo.《==================================");

myinfo = new MyInfo();

for (int i=0; i<3; i++) {

getMyInfoByIndex(myinfo, i);

Log.d(TAG, "myinfo["+i+"] -- "+myinfo);

}

}

// jni

private native int getPersonInfoByIndex(Person person, int index);

private native int getMyInfoByIndex(MyInfo myinfo, int index);

static {

//System.loadLibrary("ndk_param");

System.loadLibrary("ndk_param");

}

}

JNI:

头文件:

#include

#include

#include

#include

#include

// 获取数组的大小

# 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

// 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”的filedID

struct PersonOffsets

{

jfieldID name;

jfieldID age;

jfieldID height;

} gPersonOffsets;

struct MyInfoOffsets

{

jfieldID name;

jfieldID age;

jfieldID height;

} gMyInfoOffsets;

// 与“Person.java”对应的结构体,用于保存数据,并将数据赋值给Person.java的成员

typedef struct tagPerson

{

char mName[10];

int mAge;

float mHeight;

}Person;

typedef struct tagMyInfo

{

char mName[10];

int mAge;

float mHeight;

}MyInfo;

// 定义了3个Person

static Person gPersons[] = {

{"skywang", 25, 175},

{"eman" , 30, 166},

{"Dan" , 51, 172},

};

static MyInfo gMyInfos[] = {

{"liu", 25, 175},

{"gang" , 30, 166},

{"hong" , 51, 172},

};

#define GPERSON_NUM NELEM(gPersons)

#define GMYINFO_NUM NELEM(gMyInfos)

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);

return 0;

}

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);

return 0;

}

// 初始化函数,用于获取Java中各个成员对应的fieldID。

static void nativeClassInit (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函数的绑定表

static JNINativeMethod method_table[] = {

{ "getPersonInfoByIndex", "(Lcom/skywang/ndk/Person;I)I", (void*)getPersonInfoByIndex },//绑定

{ "getMyInfoByIndex", "(Lcom/skywang/ndk/MyInfo;I)I", (void*)getMyInfoByIndex },//绑定

};

// 注册native方法到java中

static int registerNativeMethods(JNIEnv* env, const char* className,

JNINativeMethod* gMethods, int numMethods)

{

jclass clazz;

clazz = (*env)->FindClass(env, className);

if (clazz == NULL) {

return JNI_FALSE;

}

if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) {

return JNI_FALSE;

}

return JNI_TRUE;

}

int register_ndk_param(JNIEnv *env)

{

nativeClassInit(env);

// 调用注册方法

return registerNativeMethods(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) {

return result;

}

register_ndk_param(env);

// 返回jni的版本

return JNI_VERSION_1_4;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值