Stap 5: Android-platform ondersteuning laag toevoegen
OK kunnen dus nu we gaan naar Android. Allereerst een nieuw Android C#-project te maken. We zullen ook een Android C++-Project voor dynamische bibliotheek nodig. Ik zou adviseren af te zien van de invoering van alle speciale tekens zoals een '.' in de naam van dit project omdat het zou kunnen de Android VS toolchain verwarren. We moeten dan verwijst naar de Android C++-bibliotheek in de Android C#-toepassing en ook het toevoegen van een verwijzing naar het project van de renderer C++ Shared op Android C++ library project. Ik zou ook adviseren dat u de API van de C#-project tot en met 19 te voldoen van de C++ die standaard tot en met 19. U kunt ook gewoon de C++-project API niveau naar de newer men maar met behulp van een oudere een u toegang tot meer gebruikers geeft als u nieuwe API's hoeft.
Om de werking van de gedeelde code zullen we om te vertellen van de linker te koppelen aan de wiskunde en GLESv2 bibliotheken. Om dit te doen, een pagina met eigenschappen toevoegen aan het Android C++ Library-project en noem het zoiets als "Universal". U moet gaan naar de pagina van de Input in de Linker groep en prepend "m; GLESv2;"aan de"Bibliotheek afhankelijkheden"veld.
U moet nu kunnen zijn om uw Android C#-toepassing gecompileerd en uitgevoerd, maar het zal niet fancy gewoon nog niet tonen. Vervolgens zullen we enkele C#-klassen maken in de Android project. Eerst Maak een klasse met de naam MyGLRenderer.
In zijn eigen bestand moet het als volgt uitzien:
[DllImport("libAndroidGLESBridge.so")] public static extern void on_surface_changed(int width, int height);
[DllImport("libAndroidGLESBridge.so")] public static extern void on_draw_frame();
#region IRenderer implementation public void OnDrawFrame(Javax.Microedition.Khronos.Opengles.IGL10 gl) { on_draw_frame(); }
public void OnSurfaceChanged(Javax.Microedition.Khronos.Opengles.IGL10 gl, int width, int height) { on_surface_changed(width, height); }
#region IRenderer uitvoering publiek void OnDrawFrame (Javax.Microedition.Khronos.Opengles.IGL10 gl) {on_draw_frame(); public void OnSurfaceCreated(Javax.Microedition.Khronos.Opengles.IGL10 gl, Javax.Microedition.Khronos.Egl.EGLConfig config) { on_surface_created(); } #endregion } }
openbare nietige OnSurfaceChanged (Javax.Microedition.Khronos.Opengles.IGL10 gl, int breedte, int hoogte) {on_surface_changed (breedte, hoogte); using Android.Content;using Android.Views; using Android.Opengl; using Android.Util;
openbare nietige OnSurfaceCreated (Javax.Microedition.Khronos.Opengles.IGL10 gl, Javax.Microedition.Khronos.Egl.EGLConfig config) {on_surface_created(); namespace CppGLESXamarin.Android { public class MyGLSurfaceView : GLSurfaceView { private MyGLRenderer mRenderer; #endregion public MyGLSurfaceView(Context context, IAttributeSet attrs) : base(context, attrs) { //Emulator fix SetEGLConfigChooser(8, 8, 8, 8, 16, 0);
We zullen ook worden nodig MyGLSurfaceView die zou moeten uitzien:
// Create an OpenGL ES 2.0 context. SetEGLContextClientVersion(2);
// Set the Renderer for drawing on the GLSurfaceView mRenderer = new MyGLRenderer(); SetRenderer(mRenderer); } } }
<?xml version="1.0" encoding="utf-8"?<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id=" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" /> <CppGLESXamarin.Android.MyGLSurfaceView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id=" /> </LinearLayout>
Instellen van de Renderer voor puttend uit de GLSurfaceView-mRenderer = nieuwe MyGLRenderer(); SetRenderer(mRenderer);}
Beide zou nu in aparte bestanden, één bestand of zelfs in uw hoofdbestand afhankelijk van hoe u wilt structureren van uw code. Houd er gewoon rekening mee dat "libAndroidGLESBridge.so" de naam van het doel van uw bibliotheek moet. U moet deze worden ingesteld door te gaan u het eigenschappenblad voor de Android C++-project en het instellen van de juiste naam in het veld "Target". Het moet bij voorkeur beginnen met "lib". Vervolgens zullen we om deze functies die in C# worden ingevoerd.
Ga naar uw Android C++ Library project. Verwijder de standaard-header omdat we niet nodig hebben. Vervanging van wat er in het standaardbestand .cpp met het volgende:
Dit is slechts een klein stukje van de C-code dat ons toelaat om de nodige methoden van een statische SimpleRenderer-object aanroepen. Het is helaas niet mogelijk om C++ objecten rechtstreeks benaderen via P/Invoke (DllImport). Je moet een stukje 'bezwaar agnostic' C code zoals dit moet teruglopen van de interface. Ik adviseer dat u deze soorten wrappers in de Android specifieke code en niet de gedeelde code maken. Net als u niet moet zetten de CX code voor Windows in de belangrijkste gedeeld C++-project. Dit is gewoon te verwijderen van de geen onnodige rommel en de mogelijke verwarring.
Voordat zij in staat om te zien iets zullen gewoon we onze nieuwe GLES weergave aan van de toepassing van de Android UI toevoegen. Dus ga naar "Main.axml" onder "indeling" onder "Resources" in de Android-project en voeg dat de volgende bulken de standaardknop in de bronweergave:
Als u compileert en uitvoert ziet u nu een mooie draaiende kubus.