Автоматическая генерация кода для Objective C к мосту C++

Я использовал этот код ниже в своих проектах. По сути, я сканирую весь путь к классам для поиска файла, если у меня нет точного пути. Это поможет мне убедиться, что мне не нужно указывать файл по определенному пути.

Это потому, что я столкнулся с той же ошибкой, что и вы, когда я использовал эту строку.

getClass().getClassLoader().getResource("Brochure.pdf")

Итак, я создал две функции, которые принимают имя файла и пути к классам, включенные в jar, и рекурсивно искали файл.

  private static File findConfigFile(String paths, String configFilename) {
    for (String p : paths.split(File.pathSeparator)) {
      File result = findConfigFile(new File(p), configFilename);
      if (result != null) {
        return result;
      }
    }
    return null;
  }

  private static File findConfigFile(File path,  String configFilename) {
    if (path.isDirectory()) {
      String[] subPaths = path.list();
      if (subPaths == null) {
        return null;
      }
      for (String sp : subPaths) {
        File subPath = new File(path.getAbsoluteFile() + "/" + sp);
        File result = findConfigFile(subPath, configFilename);
        if (result != null && result.getName().equalsIgnoreCase(configFilename)) {
          return result;
        }
      }
      return null;
    } else {
      File file = path;
      if (file.getName().equalsIgnoreCase(configFilename)) {
        return file;
      }
      return null;
    }
  }

Вот пример моего кода в действии:

import java.io.File;

public class FindResourcesRecursive {

    public File findConfigFile(String paths, String configFilename) {
        for (String p : paths.split(File.pathSeparator)) {
            File result = findConfigFile(new File(p), configFilename);
            if (result != null) {
                return result;
            }
        }
        return null;
    }

    private File findConfigFile(File path, String configFilename) {
        if (path.isDirectory()) {
            String[] subPaths = path.list();
            if (subPaths == null) {
                return null;
            }
            for (String sp : subPaths) {
                File subPath = new File(path.getAbsoluteFile() + "/" + sp);
                File result = findConfigFile(subPath, configFilename);
                if (result != null && result.getName().equalsIgnoreCase(configFilename)) {
                    return result;
                }
            }
            return null;
        } else {
            File file = path;
            if (file.getName().equalsIgnoreCase(configFilename)) {
                return file;
            }
            return null;
        }
    }

}

Здесь у меня есть тестовый пример, который связан с файлом «test.txt» в моей папке test / resources. Содержимое указанного файла:

A sample file

Теперь вот мой тестовый пример:

import org.junit.Test;

import java.io.*;

import static org.junit.Assert.fail;

public class FindResourcesRecursiveTest {

    @Test
    public void testFindFile() {
        // Here in the test resources I have a file "test.txt"
        // Inside it is a string "A sample file"
        // My Unit Test will use the class FindResourcesRecursive to find the file and print out the results.
        File testFile = new FindResourcesRecursive().findConfigFile(
                System.getProperty("java.class.path"),
                "test.txt"
        );

        try (FileInputStream is = new FileInputStream(testFile)) {
            int i;
            while ((i = is.read()) != -1) {
                System.out.print((char) i);
            }
            System.out.println();
        } catch (IOException e) {
            fail();
        }

    }
}

Теперь, если вы запустите этот тест, он напечатает «Пример файла» и тест будет зеленым.

Теперь, с тобой все в порядке?

5
задан GEOCHET 1 June 2009 в 17:21
поделиться

2 ответа

Это кажется мне достаточно хорошей идеей, что я был бы удивлен, не существует ли что-то как он уже. С другой стороны, так как можно скомпилировать C++ непосредственно, (взгляд на то, что .mm расширение дает Вам), это могло бы быть несколько тривиально.

1
ответ дан 14 December 2019 в 19:25
поделиться

Я не думаю, что это необходимо. С Objective C ++, Вам не нужен мост вообще. Учитывая определенный класс C++

class Foo {
  public:
    void someMethod(void);
}

можно использовать тот класс где угодно в Objective C ++ код. Например, в рамках метода:

- (void)myObjCMethod {
  Foo myFoo;

  myFoo.someMethod();

  //etc.
}

У Вас могут быть переменные экземпляра, которые указывают на классы C++, таким образом, Вы могли определить класс Objective C как

@interface Bar : NSObject {
  Foo *foo;
}

@property (assign) Foo * foo;
@end

@implementation
@synthesize foo;

- (void)dalloc {
  delete foo;
  [super dealloc];
}

- (id)init {
  if(self = [super init]) {
    foo = new Foo();
  }

  return self;
}

- (void)aMethod {
   self.foo->barMethod();
} 

Я не думаю, что можно обработать метод Objective C по шаблону, но шаблонные инстанцирования C++ в Objective C ++ являются справедливой игрой. Так же, как Objective C является строгим надмножеством C, Objective C ++ является надмножеством C++, добавляя классы Стиля Objective C и передачу сообщений.

Если Вы действительно хотели "соединить класс C++ мостом", Вы собираетесь испытать затруднения в целом, так как вещи как множественное наследование и перегрузка оператора не поддерживаются в объектной модели Objective C.

4
ответ дан 14 December 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: