2012-10-22 73 views
1

我正在做一個將使用C++庫的android應用程序。出於這個原因,我需要使用Android-NDK構建C++項目。但是我現在面臨的問題是如何使用JNI調用C++靜態函數。如何使用JNI爲android調用C++靜態函數

在我的C++代碼中,我有一個單例類。我們都知道要實現一個單例類,我們需要引入靜態函數,它負責創建這個類的一個實例。現在我需要的是使用JNI調用靜態函數來創建一個可以用於我的android應用程序的實例。

+0

這裏有什麼問題嗎? JNI C++方法可以調用靜態C++方法。你是否試圖將整個單例對象傳遞給Java? –

+0

是的。我如何將單例對象傳遞給Java? – dipanjan

+0

實際上我需要的是使用單例對象到android來訪問單例類成員函數。謝謝。 – dipanjan

回答

1

您可以在JNI邊做:

long Java_mypackage_com_createSingleton(JNIEnv* env) 
{ 
    return MySingleton::getInstance(); 
} 

bool Java_mypackage_com_useSingletonSomehow(long singleton) 
{ 
     return (MySingleton*)singleton->someFunc(); 
} 

在Singleton類:

MySingleton* getInstance() 
    { 
     if(instance_ == NULL) 
     { 
      instance_ = new MySingleton(); 
     } 
     return instance_; 

    } 

在Java方面:

package mypackage.com; 

class SingletonUser 
{ 
private long mSingletonInstance; 

public SingletonUser() { 
    mSingleton = createSingleton(); 
} 

public boolean someFunc() { 
    return useSingletonSomehow(mSingletonInstance); 
} 

private native boolean useSingletonSomehow(long instance); 
private native long createSingleton(); 

}

+0

假設我的單例類有一個成員函數名稱Create()。因此,要調用Create()函數,我需要按以下方式調用。 'bool Java_mypackage_com_useSingletonSomehow(long singleton) { return(MySingleton *)singleton-> Create(); } ' – dipanjan

+1

是的。 JNI函數必須是C函數,但您肯定可以從中調用任何C++代碼。 –

相關問題