2015-06-05 44 views
2
//my class 
class NDKSupport { 

    // Loding library 
    static { 
     System.loadLibrary("NDKTest"); 
    } 

    // Stuff in NDKSupport 
    public native String getMessageFromNDK(NDKSupport support); 

    public String getMessage() { 

     // doing some stuff over here 
     return "SOME RESULT"; 
    } 
} 

//Native code 


JNIEXPORT jstring JNICALL 
Java_com_afbb_ndkcheck_NDKSupport_getMessageFromNDK(
JNIEnv* env, jobject thiz, jobject ndkSupport) { 

jclass ndkSupportClz = env->GetObjectClass(ndkSupport); 

jmethodID getInstallationSource = 
env->GetMethodID(ndkSupportClz,"getMessage", "()Ljava/lang/String;"); 

return (jstring)env->CallObjectMethod(mainActivity, getInstallationSource); 
} 

現在,在另一個類,我創建對象並調用2種方法都將做同樣的東西。無論是在表現上還是在另一個方面,這兩個電話之間有什麼區別。來自本地方法調用的普通方法調用有什麼區別?

NDKSupport support = new NDKSupport(); 

// what is the difference between these two calls 

String d = support.getMessage(); 
String d2 = support.getMessageFromNDK(support); 

給我一些關於這方面的信息,或者如果有任何教程可用。 對不起,我的英語..

回答

1

本地方法是特定於平臺的代碼。它們通常使用C或C++等語言編寫,幷包含在庫(dll's)中。有可能創建一個混合Java應用程序,從這些庫中受益。

理由使用本地方法

  1. 獲得訪問到您的設備或或Android OS
  2. 的特殊能力獲得額外的速度
  3. 獲得對身軀龐大的現有的遺留代碼
  4. 訪問

通常情況下,良好的使用案例NDK是CPU密集型應用,如GA我引擎,處理信號,以及物理模擬

的本地方法的主要缺點是,你不會有跨平臺能力

現在,如果你不知道什麼是原生代碼,那麼很可能你不需要使用本地代碼。 Android NDK文檔解釋了這一點:

...,你應該明白NDK不會使大多數應用程序受益。作爲開發人員,您需要平衡其優點和缺點。 值得注意的是,在Android上使用本機代碼通常不會導致顯着的性能提升,但它總會增加您的應用程序的複雜性。一般來說,如果您的應用程序必須使用NDK,那麼您應該只使用NDK --絕對不要因爲您只喜歡用C/C++編程。當 檢查您是否應該使用本機代碼進行開發時,請考慮 以瞭解您的需求,並查看Android框架API是否提供您需要的功能 。

+0

@Canar謝謝你的回覆。你提到「本地方法的主要缺點是你不具備跨平臺功能。」這裏是什麼跨平臺的。你能否詳細說明一下。 – shobhan

1

的NDK允許您使用C/C++編寫代碼++,然後將其鏈接到你的Java應用程序。您可能會增加應用程序的速度。

的NDK的缺點是,它只是編譯爲特定的CPU(而留在Java的土地意味着它會在Android上的任何針對性的版本中運行)。原生C代碼將使用底層操作系統的(Linux)API(系統調用),因此比通過JVM解釋Java代碼要快得多。大多數遊戲都使用原生C代碼庫2D/3D圖形,輸入,聲音等...

所以沒有什麼區別,但你可以提高你的代碼性能,如果你想代碼某些特定的CPU,你可以用本地方法去,但如果你想使一個兼容所有類型的CPU的應用程序,你可以使用簡單的Java方法。 您可以根據您的應用需求使用任何方法。 你可以遵循一些視頻教程here。這是很好的解釋和漂亮的教程。 有很多教程這裏 - firstsecondthird

+0

謝謝你我們的明確解釋。正如你提到的「對於某些特定的CPU你可以用本地方法去」。 「特定的CPU」是指..?你能解釋一下嗎? – shobhan

+1

有各種類型的cpus系列。目前僅支持以下系列:•ANDROID_CPU_FAMILY_ARM •ANDROID_CPU_FAMILY_X86 •ANDROID_CPU_FAMILY_MIPS等,您可以對此進行掃描和歸檔。 – RajSharma

相關問題