【发布时间】:2011-01-12 16:31:00
【问题描述】:
我正在使用 Eclipse 3.5,并且我创建了一个带有一些包结构以及默认包的项目。我在默认包中有一个类 - Calculations.java,我想在任何包中使用该类(例如在com.company.calc 中)。当我尝试使用默认包中的类时,它给了我一个编译器错误。它无法识别默认包中的类。问题出在哪里?
Calculations.java - 源代码
public class Calculations {
native public int Calculate(int contextId);
native public double GetProgress(int contextId);
static {
System.loadLibrary("Calc");
}
}
我不能将我的课程放在任何其他包中。这个类有一些在 Delphi 中实现的本地方法。如果我将该类放在任何文件夹中,我将不得不更改我想要避免的那个 DLL(真的 - 我不能)。这就是为什么我把我的类放在默认包中。
【问题讨论】:
-
我在创建这个问题后找到了这个链接:stackoverflow.com/questions/283816/…。
-
当然,这个问题的重点是类和它的代码必须在默认包中。到目前为止,除了使用反射 API (对于这么简单的事情来说,真的有点过头了) 之外的任何答案都不是 解决方案。令人难以置信的是,Java 是如何试图获得它的蛋糕(不鼓励默认包)并吃掉它(让 JNI 如此复杂,我们大多数人最终都使用需要默认包的 DLL)。
-
原因似乎是历史性的,但有时确实会咬人。例如``` T.java: 导入静态 a.Foo.*;类 T { 酒吧酒吧 = 新酒吧(); } a/Foo.java: 包 a; public class Foo { public static final class Bar { } } ``` 上面编译得很好,但是,如果 Foo 放在默认包中,它就不起作用。因此,我不能静态导入 Foo.* 以便使用简写 Bar 而不是 Foo.Bar。
标签: java java-native-interface native-methods default-package