C# — Gamedev sufferingБлог о разработке игр и серверных технологияхSun, 25 May 2025 20:13:38 +0000ru-RUhourly1https://wordpress.org/?v=5.1.19/wp-content/uploads/2019/03/cropped-Lain-32x32.pngC# — Gamedev suffering3232 Будни юнитишника: сохраняйте глобальные ссылки на JNI объекты/2018/08/02/4223/budni-unitishnika-sokhranyajte-globalnye-ssylki-na-jni-obekty//2018/08/02/4223/budni-unitishnika-sokhranyajte-globalnye-ssylki-na-jni-obekty/#respondThu, 02 Aug 2018 14:43:28 +0000/?p=4223

Когда вы получили IntPtr на нативный Android объект, то GC может в какой-то момент почистить её (скорей всего, после выхода из локального скопа). Из-за того, что я одну ссылка не сохранил, дебажил код много часов, чтоб причину крашей найти.

Ещё хуже то, что стектрейс при краше никак не помогает.

Продолжить чтение

]]>
/2018/08/02/4223/budni-unitishnika-sokhranyajte-globalnye-ssylki-na-jni-obekty/feed/0
Unity-android-native: автоопределение типа при возврате объекта из JNI/2018/07/28/4204/unity-android-native-autoresolve-returned-class//2018/07/28/4204/unity-android-native-autoresolve-returned-class/#respondSat, 28 Jul 2018 18:03:17 +0000/?p=4204

Хорошо, когда вы знаете конкретный класс, который возвращает метод. Но что делать, если метод, к примеру getApplicationContext, возвращает абстрактный тип?

Пока что единственным вариантом вижу получения имени класса у полученного объекта, потом на основании этого имени нахожу соответствующий C# класс.

Если брать всё тот же метод context.getApplicationContext(), то вот этим методом можно инстанциировать соответствующий класс:

public Object ObjectCallAutoResolve(string name, params object[] args) {
IntPtr value = ObjectCall(name, GetClass().Replace('.', '/'), args);
if (value == IntPtr.Zero)
return null;
var clsname = new Object(value).GetClass().GetName();
var t = GetCsharpClass(clsname);
if (t == null)
return null;
ConstructorInfo c = t.GetConstructor(new[] { value.GetType() });
if (c != null) {
return (Object) c.Invoke(new object[] { value });
}
else {
DebugPrint("Can't instantiate class, probably no constructor with IntPtr arg");
}
return null;
}

Но да, приходится создавать пару лишних вспомогательный объектов, чтоб через них вызвать getClass().getName(), потом найти C# имя класса и инстанциировать его.

Продолжить чтение

]]>
/2018/07/28/4204/unity-android-native-autoresolve-returned-class/feed/0
Библиотека для работы с Android sdk из C# кода/2018/07/28/4191/unity-android-native-work-with-android-sdk-from-cs-code//2018/07/28/4191/unity-android-native-work-with-android-sdk-from-cs-code/#respondFri, 27 Jul 2018 21:35:07 +0000/?p=4191

Многим приходится работать с Java sdk из Unity3d либо используя самописные плагины, либо, если достаточно базовых возможностей sdk, с помощью юнитишных классов AndroidJavaClass и AndroidJavaObject.

Кто работал с этими классами знает, насколько ужасно выглядит код. Меня это тоже достало и решил для текущего проекта небольшую библиотеку сделать. Чуток причесал и залил на гитхаб.

Продолжить чтение

]]>
/2018/07/28/4191/unity-android-native-work-with-android-sdk-from-cs-code/feed/0