2012-04-19 105 views
3

在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

回答

0

那麼,如果沒有jni支持訪問$ this或者其他變量是實際上是調用,那麼您可以將B.this傳遞給本機函數。

+0

那麼,本地函數被稱爲外部,我不想讓調用者這樣做(更不用說他們可以傳遞錯誤的東西)。我目前正在通過在B中使用另一個方法來返回'A.this',並從JNI調用它,但我想擺脫它 – 2012-04-19 21:02:18

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變量。

另請注意(如果這在別人的搜索結果中出現),內部類的構造函數具有外部類的隱式第一個參數 - 所以如果你想從本地構造其中的一個,必須以這種方式請求構造函數。