首先定义了一个类class device{String strDeviceName;int i;}然后定义一个本地函数 public native int ListDev(device[] devList)然后在本地用c实现:JNIEXPORT jint JNICALL Java_com_NDKTSPtest_JniTspTest_Listdev(JNIEnv *e, jobject j, jobjectArray devList){jint dwRet;jobject dev1 = (*e)->GetObjectArrayElement(e, devList, 0);;
jclass dev = (*e)->FindClass(e, "com/hengbao/tspdatastructure/DEVICE");
jfieldID strDeviceName = (*e)->GetFieldID(e, dev, "strDeviceName", "Ljava/lang/String;");
jfieldID iType = (*e)->GetFieldID(e, dev, "iType", "I");
jstring jstr = (*e)->NewStringUTF(e,DeviceName);
(*e)->SetObjectField(e, dev1, strDeviceName, jstr);
(*e)->SetIntField(e, dev1, iType, UK_SDKEYID);
dwRet =RT_OK;
(*e)->ReleaseStringUTFChars(e, jstr, DeviceName);return dwRet;}总是有问题 这个取得类数组里面的引用类型对吗?总感觉有点问题 但又不知道问题处在哪儿?
但是在android在开发会出现问题 logcat如下:06-14 08:58:15.805: DEBUG/dalvikvm(719): Added shared lib /data/data/com.NDKTSPtest/lib/libmyjni.so 0x43597d18
06-14 08:58:15.828: DEBUG/dalvikvm(719): No JNI_OnLoad found in /data/data/com.NDKTSPtest/lib/libmyjni.so 0x43597d18
06-14 08:58:15.854: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libwebcore.so' for 'InitParams' (wrong CL)
06-14 08:58:15.864: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libmedia_jni.so' for 'InitParams' (wrong CL)
06-14 08:58:15.874: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libwebcore.so' for 'ListUK' (wrong CL)
06-14 08:58:15.885: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libmedia_jni.so' for 'ListUK' (wrong CL)
06-14 08:58:15.885: WARN/dalvikvm(719): JNI WARNING: illegal start byte 0xf0
06-14 08:58:15.885: WARN/dalvikvm(719): string: 'ð5ZC '
06-14 08:58:15.893: WARN/dalvikvm(719): in Lcom/NDKTSPtest/JniTspTest;.ListUK ([Lcom/hengbao/tspdatastructure/DEVICE;)I (FindClass)
06-14 08:58:15.893: INFO/dalvikvm(719): "main" prio=5 tid=3 NATIVE
06-14 08:58:15.893: INFO/dalvikvm(719): | group="main" sCount=0 dsCount=0 s=0 obj=0x40018e70
06-14 08:58:15.893: INFO/dalvikvm(719): | sysTid=719 nice=0 sched=0/0 handle=-1097671524
06-14 08:58:15.893: INFO/dalvikvm(719): at com.NDKTSPtest.JniTspTest.ListUK(Native Method)
jclass dev = (*e)->FindClass(e, "com/hengbao/tspdatastructure/DEVICE");
jfieldID strDeviceName = (*e)->GetFieldID(e, dev, "strDeviceName", "Ljava/lang/String;");
jfieldID iType = (*e)->GetFieldID(e, dev, "iType", "I");
jstring jstr = (*e)->NewStringUTF(e,DeviceName);
(*e)->SetObjectField(e, dev1, strDeviceName, jstr);
(*e)->SetIntField(e, dev1, iType, UK_SDKEYID);
dwRet =RT_OK;
(*e)->ReleaseStringUTFChars(e, jstr, DeviceName);return dwRet;}总是有问题 这个取得类数组里面的引用类型对吗?总感觉有点问题 但又不知道问题处在哪儿?
但是在android在开发会出现问题 logcat如下:06-14 08:58:15.805: DEBUG/dalvikvm(719): Added shared lib /data/data/com.NDKTSPtest/lib/libmyjni.so 0x43597d18
06-14 08:58:15.828: DEBUG/dalvikvm(719): No JNI_OnLoad found in /data/data/com.NDKTSPtest/lib/libmyjni.so 0x43597d18
06-14 08:58:15.854: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libwebcore.so' for 'InitParams' (wrong CL)
06-14 08:58:15.864: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libmedia_jni.so' for 'InitParams' (wrong CL)
06-14 08:58:15.874: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libwebcore.so' for 'ListUK' (wrong CL)
06-14 08:58:15.885: DEBUG/dalvikvm(719): +++ not scanning '/system/lib/libmedia_jni.so' for 'ListUK' (wrong CL)
06-14 08:58:15.885: WARN/dalvikvm(719): JNI WARNING: illegal start byte 0xf0
06-14 08:58:15.885: WARN/dalvikvm(719): string: 'ð5ZC '
06-14 08:58:15.893: WARN/dalvikvm(719): in Lcom/NDKTSPtest/JniTspTest;.ListUK ([Lcom/hengbao/tspdatastructure/DEVICE;)I (FindClass)
06-14 08:58:15.893: INFO/dalvikvm(719): "main" prio=5 tid=3 NATIVE
06-14 08:58:15.893: INFO/dalvikvm(719): | group="main" sCount=0 dsCount=0 s=0 obj=0x40018e70
06-14 08:58:15.893: INFO/dalvikvm(719): | sysTid=719 nice=0 sched=0/0 handle=-1097671524
06-14 08:58:15.893: INFO/dalvikvm(719): at com.NDKTSPtest.JniTspTest.ListUK(Native Method)
解决方案 »
- socket接受结构体并解析问题!
- 后台Task如何切换到前台
- 关于android中UI线程与渲染线程的问题
- Android编译问题 build/core/main.mk:131
- android编程:出现错误,求帮助
- 请教Android FS移植问题。谢谢!
- 开发一款安卓手机软件性能数据采集软件应该要价多少?
- android怎样创建桌面快捷按钮
- 关于输入框的问题,请大神帮忙看下
- 为什么我用eclipse安卓开发系统做出来的app项目调试运行的时候鼠标一滑动app屏幕界面,它logcat那里就立刻出现一堆红色的错误,然后就提示“很抱歉,停
- 关于android中使用数据模型
- Android程序怎么画流程图
jclass dev = (*e)->FindClass(e, "com/hengbao/tspdatastructure/DEVICE");
而且好乱。
放一段代码//返回一个结构数组,返回一个硬盘信息的结构数组
JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStructArray
(JNIEnv *env, jobject _obj)
{
//申明一个object数组
jobjectArray args = 0;
//数组大小
jsize len = 5; //获取object所属类,一般为ava/lang/Object就可以了
jclass objClass = (env)->FindClass("java/lang/Object"); //新建object数组
args = (env)->NewObjectArray(len, objClass, 0); /* 下面为获取到Java中对应的实例类中的变量*/ //获取Java中的实例类
jclass objectClass = (env)->FindClass("com/sundy/jnidemo/DiskInfo");
//获取类中每一个变量的定义
//名字
jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;");
//序列号
jfieldID ival = (env)->GetFieldID(objectClass,"serial","I"); //给每一个实例的变量付值,并且将实例作为一个object,添加到objcet数组中
for(int i=0; i < len; i++ )
{
//给每一个实例的变量付值
jstring jstr = WindowsTojstring(env,"我的磁盘名字是 D:");
//(env)->SetObjectField(_obj,str,(env)->NewStringUTF("my name is D:"));
(env)->SetObjectField(_obj,str,jstr);
(env)->SetShortField(_obj,ival,10); //添加到objcet数组中
(env)->SetObjectArrayElement(args, i, _obj);
}
//返回object数组
return args; }
注意大小写阿!!