如何在Android NDK中检测手机或平板电脑

时间:2013-09-17 17:25:58

标签: android android-ndk cocos2d-x

我正在为Android设备开发一个cocos2d-x应用程序。我有两种不同的屏幕配置,专为移动和平板设备格式设计。在main.cpp中,我想添加一些逻辑来确定设备是平板电脑还是移动设备。这样我可以在应用启动时加载适当布局的界面。

我见过用Java代码检测平板电脑或设备的解决方案,但有没有办法在NDK中用C ++做同样的事情?

1 个答案:

答案 0 :(得分:3)

要获得屏幕分辨率,您可以使用ANativeWindow

ANativeWindow nativeWindow = ANativeWindow_fromSurface(env, surface);
int width =  ANativeWindow_getWidth(renderEngine->nativeWindow);
int height = ANativeWindow_getHeight(renderEngine->nativeWindow);

但这还不够,您还需要通过NDK获得的屏幕密度。你可以使用JNI获得它。 Java中的几行最终会成为:

JNIEnv* jni;
app->activity->vm->AttachCurrentThread(&jni, NULL);

jclass activityClass = jni->FindClass("android/app/NativeActivity");
JNI_ASSERT(jni, activityClass);

jmethodID getWindowManager = jni->GetMethodID (activityClass, "getWindowManager" , "()Landroid/view/WindowManager;"); 
JNI_ASSERT(jni, getWindowManager);

jobject wm = jni->CallObjectMethod(app->activity->clazz, getWindowManager);
JNI_ASSERT(jni, wm);

jclass windowManagerClass = jni->FindClass("android/view/WindowManager");
JNI_ASSERT(jni, windowManagerClass);

jmethodID getDefaultDisplay = jni->GetMethodID(windowManagerClass, "getDefaultDisplay" , "()Landroid/view/Display;");
JNI_ASSERT(jni, getDefaultDisplay);

jobject display = jni->CallObjectMethod(wm, getDefaultDisplay);
JNI_ASSERT(jni, display);

jclass displayClass = jni->FindClass("android/view/Display");
JNI_ASSERT(jni, displayClass);

jclass displayMetricsClass = jni->FindClass("android/util/DisplayMetrics");
JNI_ASSERT(jni, displayMetricsClass);

jmethodID displayMetricsConstructor = jni->GetMethodID(displayMetricsClass, "<init>", "()V");
JNI_ASSERT(jni, displayMetricsConstructor);

jobject displayMetrics = jni->NewObject(displayMetricsClass, displayMetricsConstructor);
JNI_ASSERT(jni, displayMetrics);

jmethodID getMetrics = jni->GetMethodID(displayClass, "getMetrics", "(Landroid/util/DisplayMetrics;)V");
JNI_ASSERT(jni, getMetrics);

jni->CallVoidMethod(display, getMetrics, displayMetrics);
JNI_ASSERT(jni, true);

jfieldID xdpi_id = jni->GetFieldID(displayMetricsClass, "xdpi", "F");
JNI_ASSERT(jni, xdpi_id);

float xdpi = jni->GetFloatField( displayMetrics, xdpi_id);
JNI_ASSERT(jni, true);

代码取自this questionJNI_ASSERT是一个小错误检查宏。

获得显示器和dpi的分辨率后,计算屏幕尺寸应该很简单。你必须决定你的“手机”和“平板电脑”的截止点。 (但你总是可以偷看Android划线的位置!)