2014-06-25 67 views
2

例如,我有一個名爲HelperLib的C++庫。我有一些假設:如何使用本機庫

  1. 我可以將這個項目編譯成* so文件。 (通過一些在線幫助我在Android上構建這個庫的教程)。

  2. 我可以在C/C++中使用這個庫。通過圖書館網站的官方教程。

  3. 我有關於本地庫的基本知識。例如,使用System.loadlibrary()加載本機庫,例如調用簡單的本地C函數。

當我決定在線使用一些C++庫時,經常會遇到這些假設。他們提供教程如何使用,還有一些提供瞭如何在Android上構建這個庫。

但所有這些,我仍然無法弄清楚如何在Android上使用這個庫。從哪兒開始?在我可以使用這個庫之前,我應該做更多的事情?例如。

///// this is a C++ source file to use library 
int main() { 
    HelperLib lib = new HelperLib(); // just for example 
    lib.initialize(); 
    /// demo how this library was used 
    lib.makeConnection(); 
    lib.closeConnection(); 
    return 0; 
} 

基於上面的代碼,我可以將它移植到Android層,以及如何?通過調用line-by-line函數作爲C++示例簡單嗎?或者我們必須做「別的」?這讓我很困惑,很多人說「將端口庫引導到Android教程」,卻沒有提供調用庫函數的有用方法。

請幫助我,以上假設,我該如何繼續使用這個庫。有沒有任何教程可以幫助我解決這些問題?

謝謝:)

+0

搜索一些所謂JNI- Java本地接口。它讓Java調用C++。您需要在C或C++中爲要調用的函數編寫JNI包裝器,然後通過匹配的本地Java函數調用它們。但是完整的教程超出了SO –

+0

@GabeSechan的範圍,我可以在這些教程中進行搜索和學習。但在此之後,我應該接下來做什麼?我只是簡單地製作了一個JNI Wrapper,之後將它作爲C++示例源代碼逐行調用,對吧?我不確定在這一步。請告訴我。謝謝:) – hqt

+0

關於JNI的教程將告訴你如何在Java和C端做什麼。但是,是的,一旦雙方都完成了它就像調用一個函數一樣簡單。 –

回答

2

@Gabe Sechan已經在評論中已經提到它是那麼簡單。

1.我可以把這個項目編譯成* so文件。 (通過一些在線幫助我在Android上構建這個庫的教程)。

您將需要將JNI包裝添加到本機庫。對於例如,wrapper.cpp:

HelperLib lib; 

void Java_com_example_hqt_MainActivity_initialize() { 
    lib = new HelperLib(); 
    lib.initialize(); 
} 

void Java_com_example_hqt_MainActivity_makeConnection() { 
    lib.makeConnection(); 
} 

然後

3.我有關於機庫的基本知識。例如,使用System.loadlibrary()加載本地庫,例如調用簡單的本地C函數。

這就是,在MainActivity.java:

static { 
    Log.d(TAG, "loadLibrary"); 
    System.loadLibrary("mynativelibrary"); 
} 

public static native void initialize(); 
public static native void makeConnection(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Init native library 
    initialize(); 
} 

public void makeNativeConnection() { 
    makeConnection(); 
} 

希望這有助於:)

+0

有用,例如上面的例子,MainActivity.java應該放入'java.com.example.hqt'包中?謝謝:) – hqt

+0

不,不是'java.com.example.hqt'。在上面的例子中,Android應用的[包名稱](http://developer.android.com/guide/topics/manifest/manifest-element.html#package)應該是'com.example.hqt' - >'com .example.hqt.MainActivity' – ozbek

+0

謝謝。所以如上所述,我必須添加一個庫的包裝。而且這通常不會提供文獻庫本身。所以,我必須編寫C++包裝代碼,之後我必須重新編寫Makefile來編譯這些文件,對吧?謝謝:) – hqt