免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7131 | 回复: 10
打印 上一主题 下一主题

[Android] Native code通过JNI获取DeviceId失败,有人可以帮忙看看吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-23 16:26 |只看该作者 |倒序浏览
本帖最后由 rover12421 于 2013-09-23 17:32 编辑

我想在Native code中获取IMEI,但不想先在Java中实现,再JNI调用,而是想直接在Native中调用getDeviceId去获取,但是在执行getApplicationContext的时候无法成功,有人帮忙看看吗?非常感谢!

  1. char * get_imei2(JNIEnv *env, jobject context)
  2. {
  3.         jclass thiz_class = (*env)->FindClass(env, "android/app/Activity");
  4.         jmethodID mid_cxt = (*env)->GetMethodID(env, thiz_class, "getApplicationContext", "()Ljava/lang/Object;");
  5.         jobject app_ctx = (*env)->CallObjectMethod(env, context, mid_cxt);    // --------------在这里出错无法通过
  6.         jclass cls = (*env)->FindClass(env, "android/context/Context");
  7.         jmethodID mid = (*env)->GetMethodID(env, cls, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
  8.         jfieldID fid = (*env)->GetStaticFieldID(env, cls, "TELEPHONY_SERVICE", "Ljava/lang/String;");
  9.         jstring str = (*env)->GetStaticObjectField(env, cls, fid);
  10.         jobject telephony = (*env)->CallObjectMethod(env, app_ctx, mid, str);
  11.         cls = (*env)->FindClass(env, "android/telephony/TelephonyManager");
  12.         mid =(*env)->GetMethodID(env, cls, "getDeviceId", "()Ljava/lang/String;");
  13.         str = (*env)->CallObjectMethod(env, telephony, mid);
  14.         jsize len = (*env)->GetStringUTFLength(env, str);
  15.         char* deviceId = calloc(len + 1, 1);
  16.         (*env)->GetStringUTFRegion(env, str, 0, len, deviceId);
  17.         (*env)->DeleteLocalRef(env, str);
  18.         /* to get a string in deviceId */

  19.         return deviceId;
  20. }
复制代码

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
2 [报告]
发表于 2013-09-23 17:33 |只看该作者
回复 1# sugelawa


    给你编辑了下,不然没法看.代码最好还是放到代码框框里~~

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
3 [报告]
发表于 2013-09-23 17:44 |只看该作者
FindClass 和 GetMethodID 之后,看下结果是否为null
还有传进来的参数 context 也判断一下

论坛徽章:
0
4 [报告]
发表于 2013-09-23 21:04 |只看该作者
回复 2# rover12421 非常感谢,我找代码格式没找着来着。我检查传入的context应该是没问题的,不知道这部分代码是否正确?


   

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
5 [报告]
发表于 2013-09-24 01:06 |只看该作者
回复 4# sugelawa


    代码逻辑是没啥问题,但是仔细看了下
getApplicationContext 的返回值不是Object,而是Context,所以你这里就写错了
jmethodID mid_cxt = (*env)->GetMethodID(env, thiz_class, "getApplicationContext", "()Landroid/content/Context;");

还是给每一步加个判断比较好,容易找问题

论坛徽章:
0
6 [报告]
发表于 2013-09-24 10:18 |只看该作者
本帖最后由 sugelawa 于 2013-09-24 10:18 编辑

回复 5# rover12421 多谢兄台,还有个疑问,为什么jclass cls = (*env)->FindClass(env, "android/content/Context");这行执行结果总是NULL,而env没问题,这行代码之前的代码执行也没问题。


   

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
7 [报告]
发表于 2013-09-24 11:23 |只看该作者
回复 6# sugelawa


    你把你的测试代码打包放上来吧,我给你看看

论坛徽章:
0
8 [报告]
发表于 2013-09-24 15:10 |只看该作者
回复 7# rover12421 TestJNIProject.zip (1.14 MB, 下载次数: 154)



非常感谢,附件是我的代码。这是一个Android Studio工程,其中jni目录下有个build.sh,运行后直接会生成并将libjni.so放到目标位置,然后直接运行工程,就可以执行了。

刚看了,的确报错在Context的获取那里:
  1. 09-24 15:01:44.409  17058-17058/com.example.testjni W/dalvikvm﹕ JNI WARNING: JNI method called with exception pending
  2. 09-24 15:01:44.409  17058-17058/com.example.testjni W/dalvikvm﹕ in Lcom/example/testjni/Manager;.getDeviceIdJNI:(Landroid/content/Context;)Ljava/lang/String; (GetMethodID)
  3. 09-24 15:01:44.409  17058-17058/com.example.testjni W/dalvikvm﹕ Pending exception is:
  4. 09-24 15:01:44.409  17058-17058/com.example.testjni I/dalvikvm﹕ java.lang.NoClassDefFoundError: android/context/Context
复制代码

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
9 [报告]
发表于 2013-09-24 22:40 |只看该作者
回复 8# sugelawa


    "java.lang.NoClassDefFoundError: android/context/Context"

哈哈.找了半天,原来是你写错了
jclass cls = (*env)->FindClass(env, "android/context/Context");
====>
jclass cls = (*env)->FindClass(env, "android/content/Context");

论坛徽章:
0
10 [报告]
发表于 2013-09-24 23:18 |只看该作者
回复 9# rover12421

这是从stackoverflow上找到的代码,害得我好苦,眼珠都瞪出来了愣是没发现。
非常感谢你,问题终于被解决了。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP