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