iosmacosnativehaxehxcpp

How to create iOS- & OSX- library from Haxe and use it in native application?


I have an crossplatform implementation of own protocol, data-structures and logic written on Haxe. How I can build and use it in my enterprise-application (with native UI) for iOS and OSX?


Solution

  • How to create iOS- / OSX- library from Haxe and use it in native application

    Actuality: 12.2014; HXCPP-ver.: 3.1.39~git.

    Dependency: hxcpp

    1. Haxe -> Library

    Create a new Haxe-project with main class named HxModule.

    src/HxModule.hx
    class HxModule
    {
        public static function main()
        {
            Sys.println('Hello from HxModule: "${test()}"');
        }
    
        @:headerCode
        public static function test():Int
        {
            return 101;
        }
    }
    
    build.hxml
    -main HxModule
    -cp src
    
    -lib hxcpp
    
    # this is for Mac OS X:
    -D HXCPP_M64
    
    # this is required on Windows. the "d" stands for debug:
    #-D ABI=-MTd
    --each
    
    # at this phase we create a binary for tests
    -cpp out/cpp/module
    
    
    --next
    # at this phase we create a binary for tests
    -cpp out/cpp/module
    
    -D static_link
    -D actuate
    

    Build: $ haxe buid.hxml

    2. Xcode-project <- Library

    1. Create a new Xcode-project. It can be for OSX or iOS, Application or Cocoa Framework.
    2. In the 'Project' / 'Build Setting' / 'Header Search Paths' add paths to dependencies: (all paths must be full/not-relative and recursive)
      1. out/cpp/module/include - you have to fix it to full path;
      2. {your-haxelib-repo}/hxcpp/{version}/include - {here-yours};
      3. /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
    3. In the 'Project' / 'Build Settings' / 'Apple LLVM 6.0 - Language - C++' change values:
      • 'C++ Language Dialect' = GNU++11 [-std=gnu++11]
      • 'C++ Standard Library' = libstdc++ (GNU C++ standard library)
    4. In the 'Project' / 'Build Phases' / 'Link Binary With Libraries':
      • HxModule.a
    5. Rename file: AppDelegate.m -> AppDelegate.mm
    6. Edit AppDelegate.mm:
    AppDelegate.mm
    #import "AppDelegate.h"
    #import "HxModule.h"
    
    @implementation AppDelegate
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
        NSLog(@"test: %d", ((int)HxModule_obj::test()));
    }
    @end
    

    Additionally for autocomplete and better navigation you can add into Xcode-project the reference groups from directories:

    Possible problems:

    At the time when this text was written only one possible issue. It can be solved by editing the file {haxelib:hxcpp}/include/hxcpp.h. Simply add a few lines at the beginning of the file:

    {haxelib:hxcpp}/include/hxcpp.h
    #ifndef HXCPP_H
    #define HXCPP_H
    
    // Standard headers ....
    
    // Custom override by @suhinini
    #define Class HxcppClass
    
    // Basic mapping from haxe -> c++
    
    typedef int Int;
    typedef bool Bool;
    
    
    // Windows hack
    #define NOMINMAX
    
    
    #ifdef _MSC_VER
       #include <typeinfo.h>
       namespace hx { typedef ::type_info type_info; }
    ...
    

    see after // Standard headers .....

    Example project.