1

プロジェクトでグアバを使用できるかどうかを確認するために j2objc で遊んでいます。

私のプロジェクトは非常に単純です: j2obcj ( https://github.com/google/j2objc/wiki/Xcode-Build-Rules ) 用に構成された単一のビュー アプリケーションで、カスタム行が追加されています。appDelegete.m

#include "java/util/ArrayList.h"
#include "com/google/common/collect/Lists.h"
[...]
[ComGoogleCommonCollectLists newArrayList];

コンパイルしようとすると、次のエラーが発生します。

Undefined symbols for architecture x86_64:
  "_JavaxAnnotationMetaWhenEnum_initialized", referenced from:
      +[ComGoogleCommonBaseCharMatcher __annotations_removeFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_retainFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_replaceFromWithJavaLangCharSequence_withChar_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_replaceFromWithJavaLangCharSequence_withJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_trimFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_trimLeadingFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_trimTrailingFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      ...
  "_JavaxAnnotationMetaWhenEnum_values_", referenced from:
      +[ComGoogleCommonBaseCharMatcher __annotations_removeFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_retainFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_replaceFromWithJavaLangCharSequence_withChar_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_replaceFromWithJavaLangCharSequence_withJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_trimFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_trimLeadingFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      +[ComGoogleCommonBaseCharMatcher __annotations_trimTrailingFromWithJavaLangCharSequence_] in libguava.a(CharMatcher.o)
      ...
  "_OBJC_CLASS_$_JavaxAnnotationCheckForNull", referenced from:
      objc-class-ref in libguava.a(Ints.o)
      objc-class-ref in libguava.a(AndroidInteger.o)
  "_OBJC_CLASS_$_JavaxAnnotationCheckReturnValue", referenced from:
      objc-class-ref in libguava.a(CharMatcher.o)
      objc-class-ref in libguava.a(Joiner.o)
      objc-class-ref in libguava.a(Splitter.o)
      objc-class-ref in libguava.a(CacheBuilder.o)
      objc-class-ref in libguava.a(BaseEncoding.o)
      objc-class-ref in libguava.a(UnsignedLong.o)
      objc-class-ref in libguava.a(UnsignedInteger.o)
      ...
  "_OBJC_CLASS_$_JavaxAnnotationMetaWhenEnum", referenced from:
      objc-class-ref in libguava.a(CharMatcher.o)
      objc-class-ref in libguava.a(Joiner.o)
      objc-class-ref in libguava.a(Splitter.o)
      objc-class-ref in libguava.a(CacheBuilder.o)
      objc-class-ref in libguava.a(BaseEncoding.o)
      objc-class-ref in libguava.a(UnsignedLong.o)
      objc-class-ref in libguava.a(UnsignedInteger.o)
      ...
  "_OBJC_CLASS_$_JavaxAnnotationNullable", referenced from:
      objc-class-ref in libguava.a(Equivalence.o)
      objc-class-ref in libguava.a(FunctionalEquivalence.o)
      objc-class-ref in libguava.a(Functions.o)
      objc-class-ref in libguava.a(Joiner.o)
      objc-class-ref in libguava.a(Objects.o)
      objc-class-ref in libguava.a(Optional.o)
      objc-class-ref in libguava.a(PairwiseEquivalence.o)
      ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

リンク中に問題があるようです。 にはありませWhen.olibjre_emul.a

javaxパッケージがそこにあることを確認するためだけに、問題なく次の行を実行しようとしました

#include "javax/xml/parsers/SAXParser.h"
[...]
[[JavaxXmlParsersSAXParser alloc] init];

SAXParser.i入っていることも確認libjre_emul

$ otool -o lib/libjre_emul.a  | grep .o\): | grep SAXParser
lib/libjre_emul.a(SAXParser.o):
lib/libjre_emul.a(SAXParserFactory.o):
lib/libjre_emul.a(SAXParserFactoryImpl.o):
lib/libjre_emul.a(SAXParserImpl.o):

しかし、試してみるとWhen

#include "javax/annotation/meta/When.h"
[...]
[JavaxAnnotationMetaWhenEnum values];

グアバと同様のエラーが発生しました

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

確認したらlibjre_emul無いですWhen.o

otool -o lib/libjre_emul.a  | grep .o\): | grep When

私の設定は次のとおりです。

J2OBJC_HOME = ./bin/j2objc-0.9.5;
HEADER_SEARCH_PATHS = $(inherited) "${J2OBJC_HOME}/include";
LIBRARY_SEARCH_PATHS = $(inherited) "${J2OBJC_HOME}/lib";
OTHER_LDFLAGS = $(inherited) -l"z" -l"jre_emul" -l"guava" -l"icucore" -framework "Security" -ObjC;

別のバージョン (0.9.5、0.9.4、0.9.3、0.9) を試しましたが、エラーが残ります。

結論として、私が知る限り、j2objc で guava を使用する方法はありません。これは、欠落しているシンボルに依存するためです。

うまくいけば、誰かが私が間違っていることを証明できますか? 実際のプロジェクトで j2objc を使い始めたいです。

前もって感謝します!メリークリスマス!

4

1 に答える 1

4

上記の javax.annotation アノテーションを定義しているため、jsr305 ライブラリ (-ljsr305) でリンクしてみてください。

于 2014-12-25T05:37:22.410 に答える