// callee.m iOS Native(Objective-C) class
@interface NativeType
- (void)method:(int)arg;
@end
@implementation NativeType
// ...
@end
// bridge.m: C#/ObjC bridge code
struct NativeTypeTag;
typedef const struct CF_BRIDGED_TYPE(NativeType) NativeTypeTag* NativeTypeRef;
NativeTypeRef NativeType_init()
{
NativeType *self = [[NativeType alloc] init];
return (NativeTypeRef)CFBridgingRetain(self);
}
int NativeType_method(NativeTypeRef ref, int arg)
{
__weak NativeType *self = (__bridge NativeType *)ref;
return [self method:arg];
}
void NativeType_free(NativeTypeRef ref)
{
__weak NativeType *self = (__bridge NativeType *)ref;
CFRelease((CFTypeRef)self);
}
// caller.cs: Unity script(C#) hanlder class
class NativeHandler {
private IntPtr nativeObj;
public NativeHandler() {
nativeObj = NativeType_init();
}
~NativeHandler() {
NativeType_free(nativeObj);
}
public int method(int arg) {
return NativeType_method(nativeObj, arg);
}
[DllImport("__Internal")]
private static extern IntPtr NativeType_init();
[DllImport("__Internal")]
private static extern int NativeType_method(IntPtr ref, int arg);
[DllImport("__Internal")]
private static extern void NativeType_free(IntPtr ref);
}