2014-01-22 2 views
3

Я пишу приложение для Android, которое имеет java и собственный код c.обнаруживает, что мой apk работает на стекле или мобильном устройстве

Я знаю, что это может предсказать, если в данный момент мой APK работает на стекле с этой строки кода:

, как я могу сделать подобное обнаружение в родной код на С?

if (android.os.Build.MODEL.contains("Glass")) {

+0

Я рекомендую вам проверить, что Build.MANUFACTURER является «Google» и что Build.MODEL начинается с «Glass». Другие производители могут сделать что-то, что имеет стекло в модели. – ErstwhileIII

ответ

1

Вы, сэр, есть два пути для этого, как вы должны использовать JNI:

Вариант А. Создать класс под названием «DeviceInfo», прикрепить статический метод.

boolean isGlassDevice() { 
    return android.os.Build.MODEL.contains("Glass"); 
} 

и от вашего C/функция C++:

jclass jc_your_class = (*env)->FindClass(env, "com.your.util.DeviceInfo"); // YOUR DeviceInfo class 
jmethodID jmid_is_glass_device = (*env)->GetMethodID(env, jc_your_class, "isGlassDevice", "()Z"); // Get info method. 

jboolean jb_is_glass_device = (*env)->CallStaticBooleanMethod(env, jc_your_class, jmid_is_glass_device);  

if (jb_is_glass_device == JNI_TRUE){ 
    // Your code goes here... 
} 

Вариант B. Использование JNI, чтобы сделать всю грязную материал:

jclass jc_build = (*env)->FindClass(env, "android/os/Build"); // Build class 
jfieldID jfid_kMODEL = (*env)->GetStaticFieldID(env, jc_build, "MODEL", "Ljava/lang/String;"); // MODEL attr. 

jstring js_model_value = (*env)->GetStaticObjectField(env, obj, jfid_kMODEL); // MODEL attr. value. 
jstring js_glass_value = (*env)->NewStringUTF(env, "Glass"); // Glass string value. 

const char * nat_model_value = (*env)->GetStringUTFChars(env, js_model_value, NULL) ; 
const char * nat_glass_value = (*env)->GetStringUTFChars(env, js_glass_value, NULL) ; 

if (strcmp(nat_model_value, nat_glass_value) == 0){ 
    // Both strings are equal 
} 

Я prefeer первый метод, так как он меньше, чем вариант B. Наконец, помните, что JNI-вызовы между JVM и вашим C/C++-кодом довольно медленны по сравнению с Java-to-Java и C-to-C, поэтому вам нужно найти способ уменьшить количество вызовов между Java и C/C++.

Смежные вопросы