NativeCode中通过JNI反射调用Java层的代码,以获取IMEI为例

摘要:
简而言之,就是在NativeCode中做一些通常可以在Javacode中完成的事情,例如获取IMEI。这种方法将使Java层代码的静态分析方法失效。

简单说,就是在NativeCode中做一些正常情况下可以在Java code中做的事儿,比如获取IMEI。

这种做法会使得静态分析Java层代码的方法失效。

JNIEXPORT jstring JNICALL Java_com_xxx_yyy_MainActivity_GetIMEI
  (JNIEnv* env, jobject mContext){

    if(mContext == 0){
        return env->NewStringUTF("[+] Error: Context is 0");
    }
    jclass cls_context = env->FindClass("android/content/Context");
    if(cls_context == 0){
        return env->NewStringUTF("[+] Error: FindClass <android/content/Context> Error");
    }

    jmethodID getSystemService = (env)->GetMethodID(cls_context, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
    if(getSystemService == 0){
        return env->NewStringUTF("[+] Error: GetMethodID failed");
    }

    jfieldID TELEPHONY_SERVICE = (env)->GetStaticFieldID(cls_context, "TELEPHONY_SERVICE", "Ljava/lang/String;");
    if(TELEPHONY_SERVICE == 0){
        return env->NewStringUTF("[+] Error: GetStaticFieldID Failed");
    }

    jstring str = (jstring)(env)->GetStaticObjectField(cls_context, TELEPHONY_SERVICE);
    jobject telephonymanager = ((env)->CallObjectMethod(mContext, getSystemService, str));
    if(telephonymanager == 0){
        return env->NewStringUTF("[+] Error: CallObjectMethod failed");
    }

    jclass cls_TelephoneManager = (env)->FindClass( "android/telephony/TelephonyManager");
    if(cls_TelephoneManager == 0){
        return env->NewStringUTF("[+] Error: FindClass TelephoneManager failed");
    }

    jmethodID getDeviceId = ((env)->GetMethodID(cls_TelephoneManager, "getDeviceId", "()Ljava/lang/String;"));
    if(getDeviceId == 0){
        return env->NewStringUTF("[+] Error: GetMethodID getDeviceID failed");
    }

    jobject DeviceID = (env)->CallObjectMethod(telephonymanager,
            getDeviceId);

    //char DP_IMIE[128]={0};

    //DP_IMIE = (env)->GetStringUTFChars( DeviceID, 0);
    return (jstring)DeviceID;

 

参考:

http://www.cnblogs.com/luxiaofeng54/archive/2011/03/01/1968063.html

http://www.cnblogs.com/273809717/archive/2013/02/21/2921058.html

免责声明:文章转载自《NativeCode中通过JNI反射调用Java层的代码,以获取IMEI为例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Flask-websocket实现聊天功能使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

员工管理系统(完整版)

转载请注明出处:http://blog.csdn.net/u012860063 #include <stdio.h> #include <windows.h> #include <string.h> struct worker { int num; char name[20]; char zhiche...

打印手机IMEI 条码小工具

做了一个专用打印手机IMEI条码的小工具,有兴趣的朋友可以来联系索取。支持Zebra 105SL条码打印机。 由于需要的人比较多,特上传了一个地址,大家可以自行下载了。 下载 IMEI(International Mobile Equipment Identity)是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的"电子串号",它与每台...

Android JNI 学习(五):References Api

1. NewGlobalRef(创建全局引用) jobjectNewGlobalRef(JNIEnv *env, jobject obj); 创建 obj 参数所引用对象的新全局引用。obj 参数既可以是全局引用,也可以是局部引用。全局引用通过调用 DeleteGlobalRef() 来显式撤消。 参数: env:JNI 接口指针。 obj:全局或局部引用...

【译】NDK概述

翻译自官方文档NDK概述 NDK概述 On this page NDK使用前 介绍 NDK怎样工作 Native Activitie和应用程序 开始前 本指南假设已经熟悉安卓开发中的本地程序的概念. 介绍 本节提供了NDK如何工作的高级说明。Android NDK是一组高级工具,允许你的Android应用程序中嵌入C或C++(“native co...

Android JNI 学习(十一):Invocation Api

1. 简介 Invocation API允许软件提供商在原生程序中内嵌Java虚拟机。因此可以不需要链接任何Java虚拟机代码来提供Java-enabled的应用程序。 以下代码演示如何使用: #include <jni.h> /* where everything is defined */ //......

Android平台下的JNI开发

JNI是Java Native Interface的缩写,通过JNI可以方便我们在Android平台上进行C/C++编程。要用JNI首先必须安装Android的NDK,配置好NDK环境之后就可以在Eclipse下进行C/C++开发了。 其实JNI的原理很容易理解,其本质就是在Java层定义一个接口,同时在C层用C/C++代码实现该接口的功能并编译成动态链接...