Swift에서 Objective C 호출

설정 : Build Settings -> Swift Compiler - General -> Objective-C Bridging Header 에서 헤더 설정 (보통 mm 파일 생성 시 자동 생성 됨)

// MyProject-Bridging-Header.h
#include "MyObjectiveC.h"

// MyObjectiveC.h
@interface MyObjectiveC : NSObject
-(void)Hello
@end

// MyObjectiveC.mm
@import "MyObjectiveC.h"

@implementation MyObjectiveC
-(void)Hello
{
	// do something
}

// MySwift.swift
class Test
{
	func hello()
	{
		MyObjectiveC().Hello()
	}
}

 

Objective C에서 Swift 호출

설정 : Build Settings -> Packaging -> Defines Module : Yes ( -Swift.h가 자동 생성됨)

// MyObjectiveC.mm
#import "MyProject-Swift.h"

void Test()
{
	[[MySwift shared] Hello];
}


// MySwift.swift
#import Foundation

@objc class MySwift : NSObject {
	@objc static let shared = MySwift()
    @objc func Hello()
    {
    	print("hello world");
    }
}

 

Objective C에서 C++ 호출

// Test.hpp
#pragma once

class Test
{
public:
    Test();
    void Hello();
}

void CStyle();


// Test.cpp
Test::Test()
{
}
void Test::Hello()
{
	printf("hello");
}
void CStyle()
{
	printf("C");
}

// MyObjectiveC.mm
#import "Test.hpp"

@implementation MyObjectiveC

-(void)start
{
	CStyle();
	Test test;
	test.Hello();
}

 

C++에서 Objective C호출

// MyCpp.cpp
#include "MyObjectiveC.h"
void func()
{
	Hello();
}

// MyObjectiveC.h
#pragma once

void Hello();

// MyObjectiveC.mm

void Hello()
{
	// do something..
}

 

'iOS' 카테고리의 다른 글

[iOS] 시스템 라이브러리 추출  (0) 2022.12.09

1. Manager 생성

package com.rncli;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Manager implements ReactPackage {

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }

    @Override
    public List<NativeModule> createNativeModules(
            ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();

        modules.add(new Module(reactContext));

        return modules;
    }


    // Backward compatibility
    public List<Class<? extends JavaScriptModule>> createJSModules() {
        return new ArrayList<>();
    }
}

2. Module 생성

package com.rncli;

import android.widget.Toast;

import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

import java.util.Map;
import java.util.HashMap;

import android.util.Log;

public class Module extends ReactContextBaseJavaModule {
    private static ReactApplicationContext reactContext;

    private static final String DURATION_SHORT_KEY = "SHORT";
    private static final String DURATION_LONG_KEY = "LONG";

    Module(ReactApplicationContext context) {
        super(context);
        reactContext = context;
    }


    @Override
    public String getName() {
        return "module";
    }

    @ReactMethod
    public void hello() {
       // your code
    }
    
    @ReactMethod(isBlockingSynchronousMethod = true)
    public String hi() {
       // your code
    }

}

3. MainApplication 수정

        @Override
        protected List<ReactPackage> getPackages() {
          @SuppressWarnings("UnnecessaryLocalVariable")
          List<ReactPackage> packages = new PackageList(this).getPackages();
          packages.add(new Manager()); // 추가

          return packages;
        }

4. App.js에서 호출

import { NativeModules } from 'react-native';

NativeModules.module.hello();
var r = NativeModules.module.hi();

 

 

 

 

 

 

 

일반적으로 release 앱 권한에서는 fork & open /proc/child_pid/maps 시 권한이 없어서 "No such file or directory" 에러가 발생한다.

이를 해결하기 위해 아래와 같이 코딩한다.

prctl(PR_SET_DUMPABLE, 1, 0, 0, 0); // enable
.. fork() 수행
.. open("/proc/child_pid/maps", ) 수행
.. ptrace() 수행
prctl(PR_SET_DUMPABLE, 0, 0, 0, 0); // disable

https://android.googlesource.com/platform/frameworks/base/+/master/core/jni/com_android_internal_os_Zygote.cpp 의 EnableDebugger()를 참조하였음

또한,  EnableDebugger()을 앱에 인젝션 하면 앱 디버깅 시 manifest를 수정하지 않아도 될 것 같다. (참고 : https://codetronik.tistory.com/165?category=1096665) 

 

(안드로이드) IDA 동적 디버깅

1. 리패키징 혹은 개발 과정에서 아래 코드를 추가 // build.gradle에 추가 buildTypes { release { debuggable true } // AndroidManifest.xml에 추가 2. adb forward tcp:23946 tcp:23946 3. adb push c:\ida\db..

codetronik.tistory.com

 

+ Recent posts