2012-12-27 83 views
2

我正在使用jni,我可以在C++類的常規活動中調用java函數,但是當我嘗試在非活動類中調用java函數時,我的代碼不起作用。Android JNI:無法在非Activity類中調用函數

我的意思是

jclass activityclass = env->FindClass("com/example/test/MyActivity); 
jmethodID methodID = env->GetMethodID(activityclass,"FunctionName","()V"); 
env ->CallVoidMethod(obj,methodID); 

這工作。 當我嘗試從非活動常規java類調用相同的函數(具有相同的名稱),它不起作用。

jclass regularclass = env->FindClass("com/example/test/MyRegularClass); 
jmethodID methodID = env->GetMethodID(regularclass ,"FunctionName","()V"); 
env ->CallVoidMethod(obj,methodID); 

爲什麼我不能在非活動類中調用函數?我的錯誤是什麼?

我MyRegularClass

public class MyRegularClass{ 

    public static void FunctionName(){ 
Log.i("Java Worked","Java Worked"); 
} 
} 

我的動態班組長

public class MyActivity{ 

system.load.library("mylib"); 

@Override 
public void onCreate(Bundle savedInstanceState){ 
.... 
.... 
testJNI(); 
} 

    public static void FunctionName(){ 
Log.i("Activity Worked","Activity Worked"); 
} 

public native void testJNI(); 
} 
+0

這裏沒有足夠的信息。任何與活動有關的事情都需要一個有效的'Context',而你的'regular'類可能沒有一個。顯示更多代碼並解釋你的'FunctionName'等等。 –

+0

FunctionName是一個名稱。我的普通班級沒有上下文。它有一些方法,它只是一個普通的java類。爲什麼我不能調用這個方法?我可以發佈整個班級代碼,但他們只是普通班級和活動 – SavasCinar

+0

首先,定義'不起作用'。包含堆棧跟蹤和真實代碼(摘錄)。 –

回答

0

您需要使用GetStaticMethodID()CallStaticVoidMethod()靜態方法。這與活動中的方法無關。

+0

否它沒有工作。此外,我從方法remged靜態關鍵字,結果是一樣的。我可以打電話,但不能上課。 – SavasCinar

+0

我編輯了我的問題。這是一個小測試應用程序。在我的大型應用程序中,我需要從非活動類調用許多函數。此外,我不使用android調試器,但我可以把日誌cpp代碼。代碼在調用void方法後無法到達。 – SavasCinar

+0

您是否檢查'null'的methodID?而調試器通常是一個好主意:) –

相關問題