115 votes

Comment faire pour utiliser le même code C++ pour Android et iOS?

Android avec le NDK d'avoir le support de code C/C++ et iOS avec Objective-C++ ont aussi de soutien, donc je veux voir un exemple d'un programme natif C/C++ code partagé entre Android et iOS.

Observation: je vais répondre à cette question à la suite de la Q&A-style.

258voto

ademar111190 Points 2855

Voici un schéma de ce que je vais faire:

android and ios with cpp diagram

Afin de suivre les étapes et let's go:

  1. Faire une base.h de fichiers, ici, nous définissons la méthode concateneMyStringWithCppString qui fonctionne aussi bien sur Android que sur iphone, cette méthode va recevoir une chaîne de caractères à partir d'android ou iphone et de concaténer avec un comum rpc chaîne et de renvoyer ce concatened chaîne.

    #ifndef __HelloCpp__Core__
    #define __HelloCpp__Core__
    
    #include <iostream>
    
    const char* concateneMyStringWithCppString(const char* myString);
    
    #endif /* defined(__HelloCpp__Core__) */
    
  2. Maintenant, le core.cpp fichier avec la méthode de la mise en œuvre, nous avons une chaîne "CPP_BASE_STRING" et concaténer avec le param "const char* machaine", et de le retourner. Le myString seront livrés par ou via android ou ios.

    #include "Core.h"
    
    const char* CPP_BASE_STRING = "cpp says hello world to %s";
    
    const char* concateneMyStringWithCppString(const char* myString) {
    char* concatenedString = new char[strlen(CPP_BASE_STRING) + strlen(myString)];    
        sprintf(concatenedString, CPP_BASE_STRING, myString);    
        return concatenedString;
    }
    
  3. Nous avons donc besoin d'un wrapper pour IOS et d'autres pour android, le premier ira faire de l'IOS wrapper, premier à écrire toi wrapper en-tête, CoreWrapper.h:

    #import <Foundation/Foundation.h>
    #import "Core.h"
    
    @interface CoreWrapper : NSObject
    
    + (NSString*) concateneMyStringWithCppString:(NSString*)myString;
    
    @end
    
  4. Maintenant, le code du wrapper, il a besoin d'être Objective-C++ , code CoreWrapper.mm de fichier.

    #import "CoreWrapper.h"
    
    @implementation CoreWrapper
    
    + (NSString*) concateneMyStringWithCppString:(NSString*)myString
    {
        return [NSString stringWithUTF8String:concateneMyStringWithCppString([myString UTF8String])];
    }
    
    @end
    
  5. Et utiliser la base de wrapper sur un mode normal de contrôleur, d'abord le point de Vue du Contrôleur d'en-tête, de sorte ViewController.h

    #import <UIKit/UIKit.h>
    #import "CoreWrapper.h"
    
    @interface ViewController : UIViewController
    @end
    
  6. Et maintenant, le ViewController.mm fichier:

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        // A normal UITextView
        UITextView* txtHelloCpp = [[UITextView alloc] initWithFrame:CGRectMake(0, 140, 320, 20)];
        // Here we set the text with shared cpp code.
        [txtHelloCpp setText:[CoreWrapper concateneMyStringWithCppString:@"Objective-c"]];
        // Normal things again
        [self.view addSubview:txtHelloCpp];
        [txtHelloCpp release];
    }
    
    @end
    
  7. C'est tout pour IOS, Maintenant android tour. De le faire sur android, vous aurez besoin de l' Android NDK, un Android Wrapper du rpc et de L'application Android et rendre les fichiers, une chose par le temps:

  8. premier Android.mk, vous devez le lien partagé rpc code "core.cpp" avec le rpc, android wrapper, donc dans mon exemple, j'ai fait de mon Android.mk fichier comme suivre.

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := HelloCpp
    LOCAL_SRC_FILES := CoreWrapper.cpp
    LOCAL_SRC_FILES += ../../CPP/Core.cpp
    
    LOCAL_C_INCLUDES := $(LOCAL_PATH)../../CPP/
    
    include $(BUILD_SHARED_LIBRARY)
    
  9. Note à mon dossier de dossier de dans ces exemples est, "je vais ignorer les IOS de la structure parce que xcode organiser automatiquement":

    /-
     |-Android-
              |-jni -
                    |-Android.mk
                    |-Application.mk
                    |-CoreWrapper.cpp
              |-other android folders like res and src
     |-CPP-----
              |-Core.h
              |-Core.cpp
    
  10. maintenant, la petite Application.mk:

    APP_STL := gnustl_static
    APP_ABI := all
    
  11. ici la CoreWrapper.cpp: "l'important, vous avez besoin de savoir l'android jni mise en œuvre"

    #include <string.h>
    #include <jni.h>
    #include "../../CPP/Core.h"
    
    extern "C" {
    
    JNIEXPORT jstring JNICALL Java_la_jurema_doses_hellocpp_MainActivity_concateneMyStringWithCppString(JNIEnv* env, jobject thiz, jstring myString) {
        return env->NewStringUTF(concateneMyStringWithCppString(env->GetStringUTFChars(myString, 0)));
    }
    
    }
    
  12. Maintenant, la mise en œuvre sur l'île de java, à l'aide d'une Activité normale, le fichier MainActivity.java:

    public class MainActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // A normal textview
        TextView textView = new TextView(getApplicationContext());
        // set the text of textview with the string of shared cpp code
        textView.setText(concateneMyStringWithCppString("Javaaaa"));
        // normal things
        setContentView(textView);
    
        // only interface things nothng important
        textView.setTextSize(50);
        textView.setTextColor(Color.BLACK);
        textView.setGravity(Gravity.CENTER);
    }
    
    // very important
    private native String concateneMyStringWithCppString(String myString);
    static {
        System.loadLibrary("HelloCpp");
    }
    
    }
    

Donc, c'est tout, si vous avez fait tout droit, vous obtenez quelque chose comme ça:

screenshot 1screenshot 2screenshot 3

Vous pouvez obtenir le plein d'exemple sur github ici, et si vous comprenez la langue portugaise, vous pouvez voir ma présentation sur google docs ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X