我编写了一个包含Java和本地C代码的Android应用程序。
我知道可以使用以下代码行预测我的APK当前是否在Glass上运行:
如何在本地C代码中进行类似的检测?
if (android.os.Build.MODEL.contains("Glass")) {
我编写了一个包含Java和本地C代码的Android应用程序。
我知道可以使用以下代码行预测我的APK当前是否在Glass上运行:
如何在本地C代码中进行类似的检测?
if (android.os.Build.MODEL.contains("Glass")) {
选项A:创建一个名为“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...
}
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
}
我更喜欢第一种方法,因为它比选项B更小。最后,请记住,JVM和您的C/C++代码之间的JNI调用与Java-to-Java和C-to-C相比非常缓慢,因此您需要找到减少Java和C/C++之间调用的方法。