使用j2objc

时间:2015-10-26 12:45:39

标签: java j2objc

我最近将j2objc从0.9.4更新到最新版本(0.9.8.2.1)。以前的版本会将所有成员生成为公共成员,但默认情况下会隐藏0.9.6私有成员。出于某些原因,我必须能够访问其他类的一些私人成员。 release notes中有一个解决方案:

  

注意:--hide-private-members现在是默认的,因此私有字段   并且公共头文件中不再显示方法。如果说   打破你的项目,修复非法引用,制作那些   成员非私人(因为他们不是),或使用   --no-hide-private-members flag。

我试图将此标志附加到我的项目中,但没有成功(我无法更改java代码)。我试过阅读j2objc --help,但没有提到这个标志。所以我想知道我在哪里设置这个标志,以便像以前那样与所有公共成员一起构建项目?

我使用与描述here (in documentation)类似的makefile。这是它的一部分:

default: translate cycle_finder

clean:
    @rm -rf $(BUILD_DIR)
    @rm -rf $(J2OBJC_RESULT_DIR)
    @rm -f $(RETAIN_CYCLES)

$(BUILD_DIR)/%.o: $(BUILD_DIR)/%.m
    $(J2OBJCC) -I$(BUILD_DIR) -c $? -o $@

translate: pre_translate $(J2OBJC_GENERATED_SOURCES)
    @if [ `cat $(JAVA_SOURCES) | wc -l` -ge 1 ] ; then \
      ./build_mappings.pl $(CALCULATOR_NEUTRAL_DIR) CN > $(JAVA_PACKAGE_MAPPINGS); \
      ./build_mappings.pl $(FOUNDATION_NEUTRAL_DIR) FN >> $(JAVA_PACKAGE_MAPPINGS); \
      ./build_mappings.pl $(CALCULATOR_NEUTRAL_TEST_DIR) CNT >> $(JAVA_PACKAGE_MAPPINGS); \
      ./build_mappings.pl $(FOUNDATION_NEUTRAL_TEST_DIR) FNT >> $(JAVA_PACKAGE_MAPPINGS); \
      $(J2OBJC) \
        --no-hide-private-members \
        -sourcepath $(SOURCE_DIR) \
        $(ADDITIONAL_CLASS_PATHS) -use-arc  \
        -d $(J2OBJC_RESULT_DIR) \
        --prefixes $(JAVA_PACKAGE_MAPPINGS) \
        `cat $(JAVA_SOURCES)` ; \
    fi

cycle_finder: pre_translate $(J2OBJC_GENERATED_SOURCES)
    -@if [ `cat $(JAVA_SOURCES) | wc -l` -ge 1 ] ; then \
      $(CYCLE_FINDER) \
        --no-hide-private-members \
        -sourcepath $(SOURCE_DIR) \
        -w $(WHITELIST_PATH) \
        $(ADDITIONAL_CLASS_PATHS) \
        `cat $(JAVA_SOURCES)` > $(RETAIN_CYCLES); \
    fi

$(J2OBJC_RESULT_DIR):
    @mkdir -p $(J2OBJC_RESULT_DIR)

$(BUILD_DIR):
    @mkdir -p $(BUILD_DIR)

pre_translate: $(J2OBJC_RESULT_DIR) $(BUILD_DIR)
    @rm -f $(JAVA_SOURCES)
    @touch $(JAVA_SOURCES)

$(J2OBJC_RESULT_DIR)/%.m $(J2OBJC_RESULT_DIR)/%.h: $(SOURCE_DIR)/%.java JavaBuild.make
    @echo $< >> $(JAVA_SOURCES)

感谢您的任何帮助和建议。

2 个答案:

答案 0 :(得分:0)

--no-hide-private-members标志只是一个临时的标志,可以给项目一些时间来更新他们的访问,并且在两年前发布了0.9.4。该标志用于允许构建仍然有效,但现在被忽略。

通常,私有字段不应该被外部类访问,无论它们写入什么语言。首先,我们天真地假设本机开发人员会遵守已翻译代码中声明的访问,但我们发现Xcode&# 39;使用私有成员制作的代码完成太诱人了。现在私有字段,方法和类现在都隐藏在.m文件中。

那就是说,没有什么可以阻止你解决访问限制。要在Java中实现这一点(也应该适用于Android):

Field f = TargetClass.class.getDeclaredField("privateField");
f.setAccessible(true);
// read or write f using reflection

要本机执行此操作,您可以尝试将目标类生成的.m文件(声明字段)中的类类别复制到本机文件中。 AFAIK,只要它们没有区别,就不会阻止多个.m文件添加相同的类别类别。但是,我还没有验证这项工作,因为私人领域不应该由外部类访问!&#34; : - )

答案 1 :(得分:0)

问题是j2objc生成了无效的Objective-C代码。所有私人ivars不能属于一个类别,你最终会

error: instance variables may not be placed in class extension

您拥有的每个私有java变量。

有时代码是第三方,我们无法更新访问权限。