一個Java類做類似下面的JNI可以在初始化時調用對象的方法嗎?
public class Foo {
private final NativeCallbackHandler handler;
public Foo(NativeCallbackHandler handler) {
// I've shortened this for exposition, callSomeNativeMethod
// really happens in a superclass that I don't own (and is
// part of the lib that gives me the native part)
callSomeNativeMethod();
this.handler = handler;
}
public void handleNativeCallback(Object args) {
this.handler.callback(args);
}
private native int callSomeNativeMethod();
}
你可以假設本地方法做一些事情,可能會導致本機代碼調用handleNativeMethod
我有2個相關的問題
- 我相信本機代碼必須調用此對象上的句柄,並且還調用
GetMethodID
以訪問要調用的方法,是否可以讓該本機代碼調用方法在之前對象是否完全初始化? - 如果可以,未初始化的最終字段的語義是什麼?
如果1是肯定的話,我預計2到訪問炸燬它,所以我想我們需要使它成爲AtomicReference
爲了安全地訪問它沒有吹起來。
注意我無法控制本機庫的行爲。
是否有一些原因爲什麼你在處理程序字段設置之前調用'callNativeMethod'? – Andrew 2011-05-20 17:57:23
難道你不能建立這個並運行它並找出?你好像已經有90%的存在了...... – 2011-05-20 18:00:28
因爲我沒有擁有本地庫中的代碼,這就是它的行爲方式。問題是它不太可能會調用這個方法(這是一個時間問題),我不能*做*它做到這一點。它取決於網絡中發生的各種事情,以及某些消息何時到達,以何種順序進行,這意味着很難確定性地重新創建。因此,我需要知道在理論上我是否有問題,如果是這樣,問題是什麼 – Matt 2011-05-20 18:00:34