Étape 5: Ajouter la couche de soutien plateforme Android
OK, donc nous pouvons maintenant passer à Android. Commencez par créer un projet vide Android c#. Nous aurons également besoin un projet de bibliothèque dynamique Android C++. Je recommande de s’abstenir de mettre des caractères spéciaux comme un '.' au nom de ce projet car il pourrait confondre la toolchain VS Android. Nous devons ensuite faire référence à la bibliothèque C++ Android dans l’application Android c# et également ajouter une référence au projet de moteur de rendu partagé C++ dans le projet de bibliothèque C++ Android. Je recommande également que vous réglez l’API du projet c# sur 19 afin de correspondre le C++ qui est par défaut 19. Vous pouvez également juste changer niveau API du projet C++ à celle plus récente, mais en utilisant une ancienne on vous donne accès à davantage d’utilisateurs, si vous n’avez pas besoin d’aucune nouvel API.
Afin d’obtenir le travail de code partagé, nous aurons besoin de dire à l’éditeur de liens faire un lien vers les mathématiques et les bibliothèques GLESv2. Pour ce faire, ajoutez une page de propriétés du projet Android bibliothèque C++ et appeler quelque chose comme "Universel". Vous devez ensuite aller à la page d’entrée dans le groupe de liaison et attachez « m ; GLESv2;"au champ"Dépendances de bibliothèques".
Vous devriez maintenant être en mesure d’obtenir votre application Android c# compilé et exécuté, bien qu’il ne montre rien fantaisie tout de suite. Ensuite, nous aurons besoin créer des classes c# au projet Android. Tout d’abord, créez une classe nommée MyGLRenderer.
Dans son propre fichier il devrait ressembler à ceci :
[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 application public void OnDrawFrame (gl Javax.Microedition.Khronos.Opengles.IGL10) {on_draw_frame() ; public void OnSurfaceCreated(Javax.Microedition.Khronos.Opengles.IGL10 gl, Javax.Microedition.Khronos.Egl.EGLConfig config) { on_surface_created(); } #endregion } }
' Public Sub OnSurfaceChanged (Javax.Microedition.Khronos.Opengles.IGL10 gl, int width, int height) {on_surface_changed (largeur, hauteur) ; using Android.Content;using Android.Views; using Android.Opengl; using Android.Util;
' Public Sub 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);
Nous aurons également besoin MyGLSurfaceView qui devrait ressembler à :
// 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>
Définir le convertisseur pour dessiner sur le mRenderer GLSurfaceView = new MyGLRenderer() ; SetRenderer(mRenderer) ;}
Maintenant ces deux pourraient être dans des fichiers séparés, un seul fichier ou même dans votre fichier principal selon comment vous souhaitez structurer votre code. Veuillez simplement noter que « libAndroidGLESBridge.so » doit correspondre au nom de la cible de votre bibliothèque. Vous devez définir cela en accédant à votre page de propriété pour le projet C++ Android et définissant le nom approprié dans le champ « Cible ». Préférence, il devrait commencer par « lib ». Ensuite, nous devrons mettre en œuvre ces fonctions qui sont importées dans c#.
Accédez à votre projet C++ Library Android. Supprimer l’en-tête par défaut parce que nous n’avez pas besoin. Remplacer tout ce qui est dans le fichier .cpp par défaut par ce qui suit :
C’est juste un petit morceau de code C qui nous permet d’appeler les méthodes nécessaires d’un objet statique de SimpleRenderer. Malheureusement, il n’est pas possible d’accéder aux objets C++ directement par le biais de P/Invoke (DllImport). Vous aurez besoin d’un morceau de « s’opposer agnostic » de code C comme ça pour envelopper l’interface. Je recommande que vous créez ces types d’emballages dans le Android code spécifique et non du code partagé. Tout comme vous ne devriez pas mettre le CX code pour Windows pour l’essentiel partagé projet C++. C’est juste pour retirer les objets superflus et la confusion possible.
Avant de pouvoir voir quoi que ce soit nous suffira d’ajouter notre nouvelle vue GLES d’interface utilisateur de l’application Android. Alors allez à "Main.axml" sous « disposition » sous « Ressources » dans le projet Android et ajouter que ce qui suit ci-dessous le bouton par défaut en mode source :
Si vous compilez et exécutez, vous devriez maintenant voir une belle tournant Cube.