2010-09-03 269 views
2

最近我一直在玩NDK,發現很多網上的教程真的沒有幫助。我一直在使用this tutorial,並且它運行得非常好。Android NDK混亂

但是,這是否正確使用了NDK?我的意思是,如果我有一個遊戲與所有C++中的許多類一起說,我希望移植到android。難道我真的手動更改我的所有方法的喜歡:

JNIEXPORT jstring JNICALL Java_com_domain_ndk_NativeLib_hello 
    (JNIEnv * env, jobject obj) { 
     return (*env)->NewStringUTF(env, "Hello World!"); 
} 

我不能看到這是在移植我的代碼的一個非常有效的方式,我得到我使用NDK錯誤的感覺。我也不知道NDK樣本應該如何工作。任何人都可以將我指向正確的方向嗎?

謝謝

回答

4

我會說你的方式沒有錯,但要注意在Java和C/C++代碼之間傳遞數據是一件耗時的事情。因此,我建議你在C/C++中實際編寫大部分代碼,如果無法避免,只需從Java調用C/C++函數即可。例如,您需要將數據傳回給GUI。特別是當你編寫實時遊戲時,我會避免在Java和C/C++代碼之間傳遞數據太多。所以只要改變所有的方法,然後在Java代碼中調用它們就不是一個好主意。

順便說一句,如果你必須從C/C++回傳Java到Java,我不會將它作爲返回值傳遞,而是將目的地作爲函數調用中的參數。

+0

我已經寫了我的遊戲在一個桌面上,我可以在iPhone上運行旁邊沒有任何變化(除了一些調整和紋理加載和聲音的東西),在C + +中,所以我可以在JNI中使用這個代碼來讓它在Android上運行嗎?如果它很耗時,它是唯一的方法。比再次編寫整個遊戲要好得多。 – 2010-09-03 14:30:11

+0

好吧,我會說是的,這是可能的。但是,這取決於您的應用程序是否需要快速運行。一個簡單的益智遊戲?當然!但是如果你正在談論一款帶有複雜圖形的遊戲,我真的會考慮編寫新的代碼來調整結構,以便更好地適應Android。 – Pandoro 2010-09-06 15:28:03

1

NDK只是Android的原生C和C++開發環境。仿生(libc的Android版本)稍微有點不受限制。唯一真正的難題是將新組件集成到Android構建工具鏈中。 Android有一個高度定製的Makefile系統。下載源代碼並查看簡單的本機組件應該能夠讓你知道如何使用它。

現在,如果要將Java與C或C++集成,您需要了解Java本地接口(JNI)。您應該能夠在線找到有關JNI的良好文檔。

+0

那麼這是使用它的正確方法?獲取NDK樣本運行的任何提示? – 2010-09-03 10:43:32

+0

閱讀,閱讀,閱讀,學習,並再次閱讀 – user457015 2012-12-01 21:15:32

5

您不需要更改任何現有方法以使用「自動綁定」JNI格式。 Google NDK示例中沒有很好的示例,但Google SDK在內部使用其他JNI綁定方法:在JNI文檔中搜索RegisterNatives()。但即使如此,您只需要爲Android SDK需要與您的庫交談的幾個位置創建一個包裝:一般用戶輸入/傳感器,繪製回調以及可能的「更新」回調。除此之外,應用程序的其餘部分應保持不變,除非要讓它構建。

爲了簡化事情,我建議你不要使用原生的小部件;如果您將遊戲完全保留在OpenGL中,那麼您可以避免通過Java來在屏幕上繪製紋理,至少如果您的目標設備是1.6及更新的,NDK具有OpenGL本機綁定。

與一些意見相反(包括Google的意見),NDK可以和經常使用的用於將遊戲移植到Android。事實上,我現在正在使用它。您需要將用戶事件從Java傳遞到C++,並且您需要讓Java設置基本的GL上下文(NDK中沒有EGL綁定),但您可以使用OpenGL在C++中完成其他任何操作,一旦您基本的Java消息被傳遞給C++,你可以(大部分)忽略Java。謝天謝地。:)

您仍然需要與Java進行交談,以獲取您的文件:兩者都需要經過Java,因此您可能需要使用「反向JNI」從C++調用Java函數。也不難,並且遍地都有例子。

我談論更多有關如何在這裏訪問您的資產:File Operations in Android NDK

好運。

+0

嘿,謝謝你,很好的信息,我認爲這是一個死的問題! :)我還沒有使用NDK,但我會更新我如何繼續使用它。 – 2010-09-27 08:39:27

1

ndk(r5)的新版本現在包含完全使用本機代碼編寫應用程序的功能。

+0

今天早上我正在看這個。將不得不檢查出來! – 2010-12-22 10:27:58