0

任何人都知道如何设置 Apache Commons Logger?似乎人们让它运行起来了,但我失败得很惨。

我当前的设置非常简单:

构建.gradle:

compile('commons-logging:commons-logging:1.2')
j2objcTranslation 'commons-logging:commons-logging:1.2'

记录器初始化:

private static Log logger = LogFactory.getLog(ApiService.class);

还有一个非常简单的logging.properties文件,如果需要可以附加。

在 iOS 模拟器上翻译并运行后,抛出以下异常:

2016-09-21 19:39:35.960 temple8-ios[32544:598370] Fucking logger
2016-09-21 19:39:36.048 temple8-ios[32544:598370] *** Terminating app due to uncaught exception     'OrgApacheCommonsLoggingLogConfigurationException', reason:  'java.lang.ClassNotFoundException:  org.apache.commons.logging.impl.LogFactoryImpl (Caused by  java.lang.ClassNotFoundException:  org.apache.commons.logging.impl.LogFactoryImpl)'
 *** First throw call stack:
(
    0   CoreFoundation                      0x000000010e471d85     __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010d40cdeb objc_exception_throw + 48
    2   temple8-ios                         0x000000010c056a27 OrgApacheCommonsLoggingLogFactory_newFactoryWithNSString_withJavaLangClassLoader_withJavaLangClassLoader_ + 327
    3   temple8-ios                         0x000000010c059d06 OrgApacheCommonsLoggingLogFactory_getFactory + 3030
    4   temple8-ios                         0x000000010c056026 OrgApacheCommonsLoggingLogFactory_getLogWithIOSClass_ + 70

编辑 1

@tball 在他的回答中提供了一些很棒的细节,但这导致了一个新问题。我添加了一个静态引用LogFactoryImpl并包含java.util.logging.IOSLogHandler在项目中。尝试翻译该类时,编译器会引发以下错误:

/java/util/logging/IOSLogHandler.m:58:17: error: method definition for 'IOS_LOG_MANAGER_DEFAULTS' not found [-Werror,-Wincomplete-implementation]
 @implementation JavaUtilLoggingIOSLogHandler
                ^
java/util/logging/IOSLogHandler.h:34:1: note: method    'IOS_LOG_MANAGER_DEFAULTS' declared here
+ (NSString *)IOS_LOG_MANAGER_DEFAULTS;
^
1 error generated.

我正在使用j2objC github 存储库IOSLogHandler中的最新版本,并将生成的内容发布在gist上。IOSLogHandler.m

非常感谢所有的帮助!

4

1 回答 1

1

链接器不包括 org.apache.commons.logging.impl.LogFactoryImpl 因为它是动态加载的,因此在链接期间没有需要解析的对它的引用。我不知道如何在 Gradle 中解决此问题,但有两种通用解决方案:

  1. 使用 -ObjC 标志链接,这会导致所有静态库中的所有 Objective C 类都链接到应用程序中。但是,这可能会引入许多不需要的类,因此请检查应用程序的二进制大小之前和之后的大小,看看这是否可以接受。

  2. 在已链接到您的应用程序的类中,添加对 org.apache.commons.logging.impl.LogFactoryImpl 的引用。它可以很简单:

    @SuppressWarnings("unused") private static final Class loggingImplClass = LogFactoryImpl.class;

于 2016-09-21T20:26:06.653 回答