Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以使用JNI访问包成员吗?_Java_Java Native Interface - Fatal编程技术网

Java 可以使用JNI访问包成员吗?

Java 可以使用JNI访问包成员吗?,java,java-native-interface,Java,Java Native Interface,我在使用JNI从导入中获取对象时遇到问题。可能吗?例如,假设我的java文件中有: 导入foo.Bar; 公共类MyClass{ 公共MyClass(){ Bar.runMethod(); } } 我可以在不更改Java代码的情况下使用JNI引用“Bar”吗?我只能创建一个新的“Bar”对象,这不是我想要做的 编辑:要对此进行一点扩展,runMethod()执行如下操作: public class Bar{ public static void runMethod(){

我在使用JNI从导入中获取对象时遇到问题。可能吗?例如,假设我的java文件中有:

导入foo.Bar;
公共类MyClass{
公共MyClass(){
Bar.runMethod();
}
}
我可以在不更改Java代码的情况下使用JNI引用“Bar”吗?我只能创建一个新的“Bar”对象,这不是我想要做的

编辑:要对此进行一点扩展,runMethod()执行如下操作:

public class Bar{
    public static void runMethod(){
        Bar inst = new Bar();
        ...more code...
    }
}

所以现在有一个浮动的Bar实例,我不知道如何使用JNI访问它。若工具栏有切换按钮、单选按钮等,我就不能使用JNI来操作它们,因为我无法获得引用它的jobject。我能做些什么,或者我必须求助于编辑Java文件吗?(我不维护代码,所以这是最后的手段)

您的问题不清楚,或者您的标题不清楚,但是您当然可以将Bar实例传递给本机方法或Bar.class,或者从其中查找Bar.class。

JNI可以访问任何对象的任何方法,包括Java类的私有方法。然而,这个问题并没有提供足够的具体细节,我们无法很好地理解上下文以帮助您

Oracle参考有点迟钝,但如果您提供JNI端的代码示例,我们可能会为您揭开一点神秘的面纱:

函数完成时,方法“runMethod”中名为inst的Bar实例不再存在,除非它存储在“more code”部分后面的一个静态类变量下,这样就没有可供引用的实例了


JNI只允许您访问类成员和方法,当然不是本地方法变量。

JNI可以访问任何对象的任何方法,包括Java类的私有方法。然而,这个问题并没有提供足够的具体细节,我们无法充分理解上下文以帮助您。您是否保存了对inst的任何引用,或者是否可以将其作为参数调用JNI方法?如果它只是一个局部变量,就没有合理的方法来获取引用。换句话说,这不是关于JNI的问题,而是获取对分配的Bar对象的引用的问题。如果还不清楚,请告诉我。正如我所说,您可以将Bar实例传递给本机方法。如果这还不能回答你的问题,那仍然是不清楚的。好吧,我想我必须搞乱java源代码以获得所需的功能。我希望有某种方法可以进入一个方法的范围,或者找到一个类当前正在运行的实例,但我想没有。我对代码进行了一些编辑,将字段声明放在了顶层,但是当我试图在JNI中访问它的字段时,我遇到了NullPointerException…如果我不明白为什么我明天会发布另一个问题的话。谢谢你的帮助!
public class Bar{
public static void runMethod(){
    Bar inst = new Bar();
    ...more code...
}