Ну или не размер, а плотность пикселей. Чтобы размер изображения на всех устройствах был одинаковый (в сантиметрах).
Желательно на NDK.
Нашел только для явы:
http://developer.android.com/reference/android/util/DisplayMetrics.html
Для NDK не знаю... сам сейчас пишу на NDK без явы, но в моём случае достаточно терминов ldpi/mdpi/hdpi/xhdpi.
ALPINE
> но в моём случае достаточно терминов ldpi/mdpi/hdpi/xhdpi.
А тЫ их как получаешь?
И как они трактуются? Ну то есть таблица, что типа xhdpi - это 100% гарантия того, что dpi будет от такого-то до такого-то, а hdpi означает такие-то границы ну и так далее.
Итак, я решил сделать как тут:
http://developer.android.com/reference/android/util/DisplayMetrics.html
итак, я начал писать:
jclass c; jmethodID m; jobject o; c = env->FindClass ("android/util/DisplayMetrics"); LOGI( "class is %x", c); m = env->GetMethodID( c, "<init>", "()V"); LOGI( "constructor is %x", m); o = env->NewObject( c, m); LOGI( "object is %x", o);
Дальше надо вызвать метод getWindowManager()
Так вот, чей это метод?
И правильно ли я понимаю, что вся это цепочка методов там внутри создаёт новые экземпляры класса и их надо будет потом удалить, или на это следует забить и предоставить это жабамашине и вообще это вызывается не более одного раза за работу программы.
TarasB
ну и каша! А не проще ли от наследовать NativeActivity, выполнить этот код на java и передать данные в с++ ?
public class MyNativeActivity extends NativeActivity {}
шож.. вы так боитесь написать свои пару-строчек на java, в чем страхи то?
Что с вами будет когда зайдет речь о портирование на mac(ios)? тоже с++ only, не выйдет..
ReeV
> А не проще ли ... выполнить этот код на java
Ну нах, ещё и джаву подключать. У меня и так автогенерированный R.java иногда протухает после того, как я закрою и снова открою эклипс, приходится его удалять. Так как он автогенерированный, то он просто заново такой же создаётся и никаких проблем. А если протухнет файл, который я набирал долго и мучительно?
Ну и к тому же, жабокрестовый проект уже не получится компилировать студией как виндовое приложение и нормально отлаживать.
Короче, я тут родил такой код, у вас он работает?
float GetXDPI () { jclass c; jmethodID m; jobject o, dm; jfieldID fid; c = env->FindClass ( "android/util/DisplayMetrics"); m = env->GetMethodID ( c, "<init>", "()V"); dm = env->NewObject ( c, m); fid = env->GetFieldID ( c, "xdpi", "F"); c = env->FindClass ( "android/app/NativeActivity"); m = env->GetMethodID ( c, "getWindowManager", "()Landroid/view/WindowManager;"); o = env->CallObjectMethod ( appState->activity->clazz, m); c = env->GetObjectClass ( o); m = env->GetMethodID ( c, "getDefaultDisplay", "()Landroid/view/Display;"); o = env->CallObjectMethod ( o, m); c = env->GetObjectClass ( o); m = env->GetMethodID ( c, "getMetrics", "(Landroid/util/DisplayMetrics;)V"); o = env->CallObjectMethod ( o, m, dm); float result = env->GetFloatField ( dm, fid); LOGI( "xdpi is %f", result); return result; }
Ну вот, с местными табами в 2 пробела всё поплыло Т_Т
>>Ну нах, ещё и джаву подключать
>>Ну и к тому же, жабокрестовый проект уже не получится компилировать студией как виндовое приложение и нормально отлаживать.
LOL!
я пытался помочь...
ReeV
Ты хочешь сказать, что написать кроссплатформенную программу на жабе и крестах легче, чем на просто крестах? НЕ ВЕРЮ.
Лучше код мой проверь, работает или нет? А то я не знаю, у меня вот вывел
xdpi=127.498039
ydpi=128.336838
а я и не знаю, правда это или мусор с кучи
Engine - c++
:
Android - java(main-loop)
iOS - obj-c(main-loop)
windows - c(main-loop)
з.ы я думаю в твоем случае лучше взять Marmalade и на нем прогать.
ReeV
> з.ы я думаю в твоем случае лучше взять Marmalade и на нем прогать.
Он платный и народ что-то говорил что из-за багов мармеладить долго не вышло, пришлось на чистом ндк насвинячить.
TarasB
я тоже сначала писал на NativeActivity, но издержки по подключению рекламы.. пришлось написать свой активити)
ReeV
> я тоже сначала писал на NativeActivity, но издержки по подключению рекламы..
А это обязательно?
TarasB
да, завязывай это гиблое дело.
TarasB
> ldpi/mdpi/hdpi/xhdpi.
> А тЫ их как получаешь?
Пока никак :) Надеялся, что смог бы получить их без особых заморочек (мне ж не числовое значение dpi надо), Но, кажется, придется и правда через jclass, jobject вызывать ява-методы.
> да, завязывай это гиблое дело.
Не согласен, я тоже пишу на NDK и постараюсь не упереться в яву вообще никаким боком. Максимум - редкие вызовы ява-методов наподобие обсуждаемого здесь получения данных о дисплее.
TarasB
> Короче, я тут родил такой код, у вас он работает?
Работает, но у меня xdpi,ydpi показывает соответственно 160.000 и 160.421051; если измерить размер экрана линейкой и посчитать число пикселей на дюйм, оно будет заметно меньше. Такое и на китайском планшете LY-F1, и на смартфоне LG E400 (141.767441, 140.137924). Хотя ydpi должно быть 320 px / ( 2.559" ) = 125 dpi.
Так что данные весьма недостоверны...
ALPINE
А вот на моём покетбуке цифра идеально сошлась.
Я не думаю, что есть ещё более нормальный способ узнать дпи.
Тема в архиве.