在Java嵌套類的外例如,我有一個具有一個本機方法的內部類:訪問使用JNI
public class A {
class B {
public native void foo();
}
}
本機方法在JNI實施:
JNIEXPORT void JNICALL A_0024B_foo(JNIEnv* env, jobject b);
顯然本機功能可以訪問B.this
;它被作爲b
傳入。我如何訪問A.this
,封閉外部實例A
?
在Java嵌套類的外例如,我有一個具有一個本機方法的內部類:訪問使用JNI
public class A {
class B {
public native void foo();
}
}
本機方法在JNI實施:
JNIEXPORT void JNICALL A_0024B_foo(JNIEnv* env, jobject b);
顯然本機功能可以訪問B.this
;它被作爲b
傳入。我如何訪問A.this
,封閉外部實例A
?
那麼,如果沒有jni支持訪問$ this或者其他變量是實際上是調用,那麼您可以將B.this傳遞給本機函數。
使用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變量。
另請注意(如果這在別人的搜索結果中出現),內部類的構造函數具有外部類的隱式第一個參數 - 所以如果你想從本地構造其中的一個,必須以這種方式請求構造函數。
那麼,本地函數被稱爲外部,我不想讓調用者這樣做(更不用說他們可以傳遞錯誤的東西)。我目前正在通過在B中使用另一個方法來返回'A.this',並從JNI調用它,但我想擺脫它 – 2012-04-19 21:02:18