C++ OpenGL ES Viewer i C# (5 / 8 steg)
Steg 5: Lägg till Android-plattformen stöd lager
OK så nu kan vi gå vidare till Android. Börja med att skapa ett tomt Android C#-projekt. Vi kommer också att behöva en Android C++ dynamisk Library Project. Jag skulle rekommendera att avstå från att sätta några speciella tecken som en '.' i detta projekt eftersom det kan förvirra VS Android toolchain. Vi måste referera Android C++ library i programmet Android C# och även lägga till en referens till delade C++ renderer projektet i Android C++ library projektet. Jag skulle också rekommendera att du ändra API av C#-projektet till 19 för att matcha C++ som standard till 19. Du kan också bara ändra projektets C++ API nivå till den nyare men med en äldre man ger dig tillgång till fler användare om du inte behöver några nya API: er.
För att få delad kod fungerar kommer vi att berätta länkaren att länka till matematik och GLESv2 bibliotek. För att göra detta, lägga till en egenskapssida i Android C++ Library projektet och kallar det något liknande "Universal". Du måste gå till sidan Input i gruppen länkare och prepend "m; GLESv2;"till"Bibliotek beroenden"fältet.
Du bör nu kunna få Android C# programmet kompileras och körs, men det inte kommer Visa något fancy ännu. Nästa vi kommer att behöva skapa vissa C# klasser i Android-projektet. För det första skapa en klass som heter MyGLRenderer.
I en egen fil bör det se ut så här:
användande System.Runtime.InteropServices;
använder Android.Opengl;
namnområdet CppGLESXamarin.Android
{
klass MyGLRenderer: Java.Lang.Object, GLSurfaceView.IRenderer
{
[DllImport("libAndroidGLESBridge.so")]
offentliga statisk extern void on_surface_created();
[DllImport("libAndroidGLESBridge.so")]
offentliga statisk extern void on_surface_changed (int bredd, int höjd);
[DllImport("libAndroidGLESBridge.so")]
offentliga statisk extern void on_draw_frame();
#region IRenderer genomförande
public void OnDrawFrame (Javax.Microedition.Khronos.Opengles.IGL10 gl)
{
on_draw_frame();
}
public void OnSurfaceChanged (Javax.Microedition.Khronos.Opengles.IGL10 gl, int bredd, int höjd)
{
on_surface_changed (bredd, höjd);
}
public void OnSurfaceCreated (Javax.Microedition.Khronos.Opengles.IGL10 gl, Javax.Microedition.Khronos.Egl.EGLConfig config)
{
on_surface_created();
}
#endregion
}
}
Vi kommer också att behöva MyGLSurfaceView som ska se ut:
använder Android.Content;
använder Android.Views;
använder Android.Opengl;
använder Android.Util;
namnområdet CppGLESXamarin.Android
{
allmän klass MyGLSurfaceView: GLSurfaceView
{
privat MyGLRenderer mRenderer;
offentliga MyGLSurfaceView (kontext sammanhang, IAttributeSet attrs): base (sammanhang, attrs)
{
Emulator fix
SetEGLConfigChooser (8, 8, 8, 8, 16, 0);
Skapa ett OpenGL ES 2.0-sammanhang.
SetEGLContextClientVersion(2);
Ställa in återgivningstillägget för att rita på GLSurfaceView
mRenderer = ny MyGLRenderer();
SetRenderer(mRenderer);
}
}
}
Nu kan båda dessa vara i separata filer, en fil eller ens i din huvudfil beroende på hur du vill strukturera din kod. Observera bara att "libAndroidGLESBridge.so" namnet på målet på biblioteket. Du bör ange detta genom att du egenskapssidan för Android C++ projektet och ställa in lämpligt namn i fältet "Mål". Det bör helst börja med "lib". Därefter kommer vi att genomföra dessa funktioner som importeras till C#.
Gå till projektet C++-bibliotek för Android. Ta bort rubriken standard eftersom vi inte behöver den. Ersätta vad är i standard .cpp fil med följande:
Detta är bara en liten bit av C kod som tillåter oss att kalla de nödvändiga metoderna för ett statiskt SimpleRenderer objekt. Tyvärr är det inte möjligt att komma åt C++-objekt direkt via P/Invoke (DllImport). Du behöver en bit "protesterar agnostiker" C kod såhär att Linda gränssnittet. Jag rekommenderar att du skapar dessa typer av omslag i Android specifika koden och inte delade koden. Precis som du inte bör delade sätta CX koden för Fönstren i huvudsak C++ projektet. Detta är bara att ta bort onödiga trassel och möjliga förvirring.
Innan man kan se något vi bara måste du lägga till våra nya GLES Visa att programmet Android UI. Så gå till "Main.axml" under "layout" under "Resurser" i Android-projektet och Lägg till följande bälg standardknappen i vyn Källa:
<? XML-version = "1.0" encoding = "utf-8"?
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
Android: orientering = "vertikala"
Android: layout_width = "fill_parent"
Android: layout_height = "fill_parent" >
< knappen
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 >
Om du kompilera och köra bör du nu se en fin snurrande kub.