2016-09-09 4 views
0

Für einfache Signatur-Funktion einfach alles:DllImport statische C++ Bibliothek in C# Unity3d

[DllImport("__Internal")] 
public static extern MyFunc(int a); 

Wie kann es für die Funktion als

static App* Create(const AppOptions& options, JNIEnv* jni_env, 
       jobject activity); 

Was von Zeigern und Referenzen in C ersetzen ++ für C# ?

Antwort

0

Sie müssen dafür Marshaling verwenden.

Beispiel:

/* unmanaged code declarations */ 

struct UnmanagedStruct { 
    int n; 
}; 

void PassByValue (struct UnmanagedStruct s); 

void PassByReferenceIn (struct UnmanagedStruct *s); 
void PassByReferenceOut (struct UnmanagedStruct *s); 
void PassByReferenceInOut (struct UnmanagedStruct *s); 

struct UnmanagedStruct ReturnByValue(); 
struct UnmanagedStruct* ReturnByReference(); 

void DoubleIndirection (struct UnmanagedStruct **s); 

Die Wrapper-Klasse sein könnte:

/* note: sequential layout */ 
[StructLayout (LayoutKind.Sequential)] 
class ClassWrapper { 
    public int n; 

    /* cannot wrap function PassByValue */ 

    /* PassByReferenceIn */ 
    [DllImport ("mylib")] 
    public static extern 
     void PassByReferenceIn (ClassWrapper s); 

    /* PassByReferenceOut */ 
    [DllImport ("mylib")] 
    public static extern 
     void PassByReferenceOut ([Out] ClassWrapper s); 

    /* PassByReferenceInOut */ 
    [DllImport ("mylib")] 
    public static extern 
     void PassByReferenceInOut ([In, Out] ClassWrapper s); 

    /* cannot wrap function ReturnByValue */ 

    /* ReturnByReference */ 
    [DllImport ("mylib")] 
    public static extern ClassWrapper ReturnByReference(); 
     /* note: this causes returned pointer to be freed 
      by runtime */ 
    /* DoubleIndirection */ 
    [DllImport ("mylib")] 
    public static extern 
     void DoubeIndirection (ref ClassWrapper s); 
} 

Hier sind einige nützliche Links:

  1. Interop with Native Libraries
  2. Marshaling with C#
  3. Default Marshaling for Objects