Android NDK几点回调方式
一、NDK中获取android设备ID的方式
Java代码如下(获取设备ANDROID_ID):
final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
对应的c代码(相当蛋疼),注意如果是C++,需要把所有的(*env)->替换成env->,同时去掉第一个参数env
char *
get_android_id(JNIEnv *env, jobject mContext, jobject actObj)
{
char *szDevId = NULL; if (!mContext) {
return szDevId;
} jclass resCls = (*env)->FindClass(env, "android/content/Context");
jmethodID getMethod = (*env)->GetMethodID(env, resCls, "getContentResolver", "()Landroid/content/ContentResolver;");
jobject resolver = (*env)->CallObjectMethod(env, actObj, getMethod);
if (resolver == NULL) {
LOGE("Invalid resolver!");
} jclass cls_context = (*env)->FindClass(env, "android/provider/Settings$Secure");
if (cls_context == NULL) {
LOGE("Invalid cls_context!");
} jmethodID getStringMethod = (*env)->GetStaticMethodID(env, cls_context, "getString", "(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");
if (getStringMethod == NULL) {
LOGE("Invalid getStringMethod!");
} jfieldID ANDROID_ID = (*env)->GetStaticFieldID(env, cls_context,
"ANDROID_ID", "Ljava/lang/String;");
jstring str = (jstring)((*env)->GetStaticObjectField(env, cls_context, ANDROID_ID)); jstring jId = (jstring)((*env)->CallStaticObjectMethod(env, cls_context, getStringMethod, resolver, str));
szDevId = (char *)((*env)->GetStringUTFChars(env, jId, )); return szDevId;
}
如果是手机,还可以通过TelephoneManager.getDeviceId()方式来获取:
Java代码:
final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();
对应的C代码:
char *
get_telepone_id(JNIEnv *env, jobject mContext, jobject actObj) {
char *szDevId = NULL; if(mContext == ){
return szDevId;
} jclass cls_context = (*env)->FindClass(env, "android/content/Context"); jmethodID getSystemService = (*env)->GetMethodID(env, cls_context, "getSystemService",
"(Ljava/lang/String;)Ljava/lang/Object;"); if(!getSystemService){
return szDevId;
} jfieldID TELEPHONY_SERVICE = (*env)->GetStaticFieldID(env, cls_context,
"TELEPHONY_SERVICE", "Ljava/lang/String;");
if(!TELEPHONY_SERVICE){
return szDevId;
} jstring str = (jstring)(*env)->GetStaticObjectField(env, cls_context, TELEPHONY_SERVICE);
jclass cls_tm = (*env)->FindClass(env, "android/telephony/TelephonyManager");
if(!cls_tm){
return szDevId;
} jobject telephonymanager = (*env)->CallObjectMethod(env, actObj, getSystemService, str);
if(!telephonymanager){
return szDevId;
} jmethodID getDeviceId = (*env)->GetMethodID(env, cls_tm, "getDeviceId", "()Ljava/lang/String;");
if(!getDeviceId){
return szDevId;
}
jstring deviceid = (jstring)(*env)->CallObjectMethod(env, telephonymanager, getDeviceId); szDevId = (char *)(*env)->GetStringUTFChars(env, deviceid, ); (*env)->DeleteLocalRef(env, cls_tm);
(*env)->DeleteLocalRef(env, cls_context);
(*env)->DeleteLocalRef(env, telephonymanager); return szDevId;
}
二、通过NDK获取证书签名
Java代码:
PackageInfo pis;
try {
pis = mContext.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES); //获取包信息
Signature sigs = pis.signatures[0]; //获取签名
int hash = sigs.hashCode(); //获取签名的哈希码
} catch(Exception e) {
//TODO:log here.
}
对应的C代码:
int
get_apk_signature(JNIEnv *env, jobject obj) { jclass cls = (*env)->FindClass(env, "android/content/ContextWrapper");
//this.getPackageManager();
jmethodID mid = (*env)->GetMethodID(env, cls, "getPackageManager",
"()Landroid/content/pm/PackageManager;");
if (mid == NULL) {
return -;
} jobject pm = (*env)->CallObjectMethod(env, obj, mid);
if (pm == NULL) {
return -;
} //this.getPackageName();
mid = (*env)->GetMethodID(env, cls, "getPackageName", "()Ljava/lang/String;");
if (mid == NULL) {
return -;
} jstring packageName = (jstring)(*env)->CallObjectMethod(env, obj, mid); // packageManager->getPackageInfo(packageName, GET_SIGNATURES);
cls = (*env)->GetObjectClass(env, pm);
mid = (*env)->GetMethodID(env, cls, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
jobject packageInfo = (*env)->CallObjectMethod(env, pm, mid, packageName, 0x40); //GET_SIGNATURES = 64;
cls = (*env)->GetObjectClass(env, packageInfo);
jfieldID fid = (*env)->GetFieldID(env, cls, "signatures", "[Landroid/content/pm/Signature;");
jobjectArray signatures = (jobjectArray)(*env)->GetObjectField(env, packageInfo, fid);
jobject sig = (*env)->GetObjectArrayElement(env, signatures, ); cls = (*env)->GetObjectClass(env, sig);
mid = (*env)->GetMethodID(env, cls, "hashCode", "()I");
int sig_value = (int)(*env)->CallIntMethod(env, sig, mid);
return sig_value;
}
Android NDK几点回调方式的更多相关文章
- [转]Android NDK几点回调方式
一.NDK中获取android设备ID的方式 Java代码如下(获取设备ANDROID_ID): final String androidId = Secure.getString(context.g ...
- Android事件处理的2种方式:监听器与回调
android组件的事件处理有2种方式: 1.基于监听器的事件处理方式:先定义组件,然后为组件设定监听器. 详见http://blog.csdn.net/jediael_lu/article/deta ...
- Android NDK调试出错Unknown Application ABI, Unable to detect application ABI's的解决方式
今天在调试Android NDK的时候,ADT的控制台报了这个错误: Unknown Application ABI, Unable to detect application ABI's 在网上查了 ...
- 初识Android NDK
本文介绍Windows环境下搭建Android NDK开发环境,并创建一个简单的使用Native代码的Android Application. 一.环境搭建 二.JNI函数绑定 三.例子 一.环境搭建 ...
- !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-opencv-development-3/ Android Ndk a ...
- Android NDK 和 OpenCV 整合开发总结(3)
Android NDK 和 OpenCV 整合开发总结(3) http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-open ...
- Android NDK开发之C调用Java及原生代码断点调试(二)
上一篇中,我们主要学习了Java调用本地方法,并列举了两大特殊实例来例证我们的论据,还没学习的伙伴必须先去阅读下,本次的学习是直接在上一篇的基础上进行了.点击:Android NDK开发之从Java与 ...
- 简单的调用OpenCV库的Android NDK开发 工具Android Studio
前言 本博客写于2017/08/11, 博主非专业搞安卓开发, 只是工作的需要倒腾了下Android NDK相关的开发, 博文中有什么不正确.不严格的地方欢迎指正哈 本文后续也许还会有删改, 就 ...
- Android NDK之二:创建NativeActivity
转:http://blog.csdn.net/xiruanliuwei/article/details/7560914 Android NDK为我们提供了两种方式来实现我们的native activi ...
随机推荐
- 【浅层优化实战】ssh远程登录Linux卡慢的全过程排查及解决方案
ssh远程登录Linux卡慢的全过程排查及解决方案 前言: 在linux操作系统使用过程中偶然一次感到使用ssh远程连接软件连接操作系统需要等待许久,第一次没在意,第二次也没在意,第三次有点忍受不住了 ...
- Python学习之路二
今天主要学习了列表,python的列表真的事太强大了,由于内容比较多,今天就先简单的介绍一下新学的几个成员函数吧. 首先我们要了解list是一种序列类型,其构造方式有四种形式: (1)空列表 [] ( ...
- MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(04)
1.3.3 框架窗口对象 MFC的CWnd类及其派生类为窗口或应用程序创建的窗口提供了面向对象的接口. CMainWindow是从CFrameWnd类派生而来,CFrameWnd模仿框架窗口的行为,可 ...
- SQLServer存储过程和触发器学习记录及简单例子
一.存储过程 存储过程即为能完成特定功能的一组SQL语句集.如果需要对查出的多条数据进行操作的话,这里需要理解游标(CURSOR)的概念,对于oracle有for each row命令,可以不用游标 ...
- 执行时关闭标识位 FD_CLOEXEC 的作用
首先先回顾 apue 中对它的描述: ① 表示描述符在通过一个 exec 时仍保持有效(书P63,3.14节 fcntl 函数,在讲 F_DUPFD 时顺便提到) ② 对打开文件的处理与每个描述符的执 ...
- 使用Mulesoft建立webservice, simple方式,POJO
Mulesoft是使用CXF来支持web service,有三种方式 1.JAX-WS 2.Simple, POJO 3. Proxy, pass-throught 本文介绍POJO,最简单的方式 1 ...
- Hadoop示例程序WordCount详解及实例(转)
1.图解MapReduce 2.简历过程: Input: Hello World Bye World Hello Hadoop Bye Hadoop Bye Hadoop Hello Hadoop M ...
- Nginx+Tomcat构建动、静分离WEB架构
一.简介 二.环境介绍 三.后端服务器安装配置 四.安装论坛 五.安装配置前端Nginx服务器 六.验证服务 一.Tomcat简介 Tomcat是Apache 软件基金会(Apache Softwar ...
- Java泛型学习笔记 - (三)泛型方法
泛型方法其实和泛型类差不多, 就是把泛型定义在方法上, 格式大概就是: public <类型参数> 返回类型 方法名(泛型类型 变量名) {...}泛型方法又分为动态方法和静态方法,:1. ...
- (c语言编程)出现错误:null undeclared identifier
原因:没有添加头文件#include <stdio.h> 添加完头文件后,错误消失