网上的文章大部分参差不齐,有的这样写有的那样写,多多少少有 bug,然后就自己探索了一下,基本下面这种写法应该算比较标准的,有任何问题可以评论交流下。
Java层
public class myInfo {
public String fileType;
public long fileSize;
public int result;
public long eConsumeTime;
public long dConsumeTime;
@Override
public String toString()
{
return ;
}
}
Native层
头文件
//成员变量与Java层一一对应
typedef struct cppInfo
{
char *fileType;
long fileSize;
int result;
long eConsumeTime;
long dConsumeTime;
}mycppInfo;
cpp文件
jobjectArray getLogInfo(JNIEnv *env, jobject thiz){
//初始化数组
jobjectArray logInfo = NULL;
jsize logInfoLen = 1234;
//获取Java中的对应的实例类
jclass jniInfo = (env)->FindClass("com/example/myInfo");
//初始化返回数组
logInfo = (env)->NewObjectArray(logInfoLen, jniInfo, NULL);
//获取类构造函数
jmethodID objectClassInitID = (env)->GetMethodID(jniInfo, "<init>", "()V");
jobject objectNewEng;
//获取类中每一个变量的定义
jfieldID fileType = (env)->GetFieldID(jniInfo,
"fileType",
"Ljava/lang/String;");
jfieldID fileSize = (env)->GetFieldID(jniInfo, "fileSize", "J");
jfieldID Result = (env)->GetFieldID(jniInfo, "result", "I");
jfieldID eConsumeTime = (env)->GetFieldID(jniInfo, "eConsumeTime", "J");
jfieldID dConsumeTime = (env)->GetFieldID(jniInfo,"dConsumeTime", "J");
//给每一个实例的变量赋值,添加到数组中
for(int i = 0; i < logInfoLen; i++)
{
//初始化类
objectNewEng = (env)->NewObject(jniInfo, objectClassInitID);
//赋值操作
(env)->SetObjectField(objectNewEng,fileType,(env)->NewStringUTF(mycppInfo[i].fileType));
(env)->SetLongField(objectNewEng, fileSize, mycppInfo[i].fileSize);
(env)->SetIntField(objectNewEng, Result, mycppInfo[i].result);
(env)->SetLongField(objectNewEng, eConsumeTime, mycppInfo[i].eConsumeTime);
(env)->SetLongField(objectNewEng, dConsumeTime, mycppInfo[i].dConsumeTime);
//添加到objcet数组中
(env)->SetObjectArrayElement(logInfo, i, objectNewEng);
}
return logInfo;
}