这种情况java的class对应C++/C的结构体,即就是java的class中的成员变量和C++/C中结构体的成员变量一一对应。假设C++/C的结构体定义为:
typedef struct _Para_tag
{
int x;
short y;
char az[100];
char h;
unsigned int t;
}Para_Tag;
那么对应的Java中的class为:
public class Para_Tag
{
int x;
short y;
String z;
char h;
long t; // 注意,Java中没有unsigned int 类型,为了保持精度,用long
}
Java 接口:public void setPara(Para_Tag tag);
JNI:
JNIEXPORT void JNICALL Java_setPara_ 1native (JNIEnv *env, jclass thiz, jobject obj)
{
Para_Tag tag;
jclass DataCls = env->FindClass("com/Para_Tag"); // 通过class path找到class的标识
/* 对struct中的每个变量逐一赋值 */
jfieldID dataId = env->GetFieldID(DataCls, "x", "I");
tag.x = env->GetIntField(obj, dataId);
dataId = env->GetFieldID(DataCls, "y", "S");
tag.y = env->GetShortField(obj, dataId);
dataId = env->GetFieldID(DataCls, "z", "Ljava/lang/String;");
/* 注意Java中的String类型如何通过JNI转换为char * */
jstring jstr = (jstring)env->GetObjectField(obj, dataId);
const char* str;
jboolean isCopye = false;
if(NULL == jstr)
{
return;
}
str = env->GetStringUTFChars(jstr, &isCopye);
strncpy(tag.az,str,100);
tag.az[99] = '\0';
env->ReleaseStringUTFChars(jstr, str); // 注释放转为UTF-8的String对象空间
dataId = env->GetFieldID(DataCls, "h", "C");
tag.h = env->GetCharField(obj, dataId);
dataId = env->GetFieldID(DataCls, "t", "J"); // 注意long对应的签名是J,不是L
tag.t = (jlong)env->GetLongField(obj, dataId);
}
从上面例子看出主要是调用env->FindClass,找到对应Java类,后面就是针对Java类中基本类型成员做操作。