使用JNI访问嵌套类的外部实例

时间:2012-04-19 20:46:45

标签: java java-native-interface inner-classes nested-class

在Java中,我有一个内部类,它有一个本机方法:

public class A {
    class B {
        public native void foo();
    }
}

本机方法在JNI中实现:

JNIEXPORT void JNICALL A_0024B_foo(JNIEnv* env, jobject b);

显然,本机功能可以访问B.this;它以b传递。如何访问A.thisA的封闭外部实例?

2 个答案:

答案 0 :(得分:2)

使用javap,我很确定答案是this$0

$ javac A.java
$ javap -s -p 'A$B'
Compiled from "A.java"
class A$B extends java.lang.Object{
final A this$0;
  Signature: LA;
A$B(A);
  Signature: (LA;)V
public native void foo();
  Signature: ()V
}

请注意,如果在unix样式的命令行上运行,则需要使用引号来保持$不被解释为shell变量的开头。

另请注意(如果出现在其他人的搜索结果中)内部类的构造函数具有外部类的隐式第一个参数 - 所以如果您想从本机构造其中一个,那么你将会必须以这种方式询问构造函数。

答案 1 :(得分:0)

好吧,如果没有jni支持访问$ this或者实际调用的变量,你可以将B.this传递给本机函数。