NDK獲取android唯一裝置號,簡單的將andorid_id 和 serial拼接起來。
阿新 • • 發佈:2019-01-02
NDK獲取android唯一裝置標識
裝置唯一標識只是簡單的將andorid_id 和 serial拼接起來。你也可以使用自己的邏輯進行拼接。
- java 實現
- native 實現
java 實現程式碼
public static String getUniqueId(Context context) {
// 獲取 android_id
String androidID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
// 拼接 serial
return androidID + Build.SERIAL;
}
native 實現 (將上面的java 程式碼轉化為 jni 程式碼)
public native String getAndroidId();
extern "C"
JNIEXPORT jstring JNICALL
Java_com_encrypt_MainActivity_getAndroidId(JNIEnv *env, jobject instance) {
// get contentResolver
jclass activity = env->GetObjectClass(instance);
jmethodID method = env->GetMethodID(activity, "getContentResolver" ,
"()Landroid/content/ContentResolver;");
jobject resolverInstance = env->CallObjectMethod(instance, method);
// get android_id from android Settings$Secure
jclass androidSettingsClass = env->FindClass("android/provider/Settings$Secure");
jmethodID methodId = env->GetStaticMethodID(androidSettingsClass, "getString" ,
"(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");
jstring param_android_id = env->NewStringUTF("android_id");
jstring android_id = (jstring) env->CallStaticObjectMethod(androidSettingsClass, methodId, resolverInstance,
param_android_id);
// get serial num from android Build
jclass androidBuildClass = env->FindClass("android/os/Build");
jfieldID SERIAL = env->GetStaticFieldID(androidBuildClass, "SERIAL", "Ljava/lang/String;");
jstring serialNum = (jstring) env->GetStaticObjectField(androidBuildClass, SERIAL);
// concat strings
jclass String_clazz = env->FindClass("java/lang/String");
jmethodID concat_methodID = env->GetMethodID(String_clazz, "concat",
"(Ljava/lang/String;)Ljava/lang/String;");
jstring result = (jstring) env->CallObjectMethod(android_id, concat_methodID, serialNum);
// release
env->DeleteLocalRef(param_android_id);
env->DeleteLocalRef(serialNum);
return result;
}