1

我们使用 J2ObjC 并尝试切换到 Xcode 6 的动态框架,以便将 Swift 合并到项目中。use_frameworks!在我们使用 J2ObjC 的情况下,简单地添加到我们的 Podfile 效果很好,但是当添加引用它的其他库时问题就来了。

在这个特定的示例中,我的 Podfile 中有两个 pod,J2ObjC以及使用它的任何其他 pod。让我们称之为whatever。当前的J2ObjCpodspec 可以在这里找到。这是 podspec whatever

Pod::Spec.new do |s|
  s.ios.deployment_target = '8.0'
  s.requires_arc = true
  s.source_files = '**/*.{h,m}'
  s.dependency 'J2ObjC'
  s.xcconfig = { 'HEADER_SEARCH_PATHS' => '${PODS_ROOT}/J2ObjC/dist/include',
  'LIBRARY_SEARCH_PATHS' => '${PODS_ROOT}/J2ObjC/dist/lib' }
end

到目前为止,一切都很好。现在,如果我想引用一个 Java 类,比如JavaUtilArrayList在我的应用程序中,我可以这样做。

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    JavaUtilArrayList *arrayList = [[JavaUtilArrayList alloc]init];
    NSString *whatever = @"o hai";
    [arrayList addWithId:[whatever copy]];
    NSLog(@"%@", arrayList);
}

太棒了,J2ObjC在我的主要目标内工作。但是如果我尝试在里面做同样的事情whatever,即使编译器认为一切都很好(J2ObjC导入工作,类可用等),我得到一个链接器错误:

#import "SomeClass.h"
#import "java/util/ArrayList.h"

@implementation SomeClass    // Inside 'whatever'
-(JavaUtilArrayList *)arrayList {
    NSString *aThing = @"o hai";
    JavaUtilArrayList *myList = [[JavaUtilArrayList alloc]init];
    [myList addWithId:aThing];
    NSLog(@"%@", myList);
    return myList;
}

导致:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_JavaUtilArrayList", referenced from:
      objc-class-ref in SomeClass.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我一直在疯狂地阅读 CocoaPods 指南man ldJ2ObjC指南,但仍然没有得到任何结果。有没有人在上面构建了一个 podJ2ObjC并使用它成功安装了它use_frameworks!?任何建议将不胜感激。

4

1 回答 1

0

任何带有“_OBJC_CLASS”的符号都来自 J2ObjC。如果它以“_OBJC_CLASS_$_Java”开头,那么它来自 Java 运行时环境 (JRE)。如果它没有“$_Java”,请查看此答案

链接器缺少 J2ObjC(JRE 仿真库)中的 libjre_emul.a 库。您需要配置以下内容:

  1. LIBRARY_SEARCH_PATHS:J2OBJC_HOME/lib
  2. OTHER_LDFLAGS:-l"jre_emul"

我建议尝试J2ObjC Gradle 插件,因为它会自动为您配置它。或者,请参阅Xcode 构建规则

于 2015-07-15T19:19:17.560 回答