java jni開發(fā)中c程序申請(qǐng)的內(nèi)存是否在java的對(duì)堆內(nèi)存或棧內(nèi)存?
jni開發(fā)中c程序申請(qǐng)的內(nèi)存是否在java的對(duì)堆內(nèi)存或棧內(nèi)存?不,Java的內(nèi)存由JVM虛擬機(jī)管理。它相當(dāng)于預(yù)先從操作系統(tǒng)的內(nèi)存中取出一個(gè)塊并對(duì)其進(jìn)行獨(dú)占管理。它屬于已經(jīng)使用過(guò)的那個(gè)。Java的內(nèi)存又
jni開發(fā)中c程序申請(qǐng)的內(nèi)存是否在java的對(duì)堆內(nèi)存或棧內(nèi)存?
不,Java的內(nèi)存由JVM虛擬機(jī)管理。它相當(dāng)于預(yù)先從操作系統(tǒng)的內(nèi)存中取出一個(gè)塊并對(duì)其進(jìn)行獨(dú)占管理。它屬于已經(jīng)使用過(guò)的那個(gè)。Java的內(nèi)存又從這個(gè)內(nèi)存中一個(gè)一個(gè)地劃分出來(lái)。JNI是Java程序與C語(yǔ)言之間的交互技術(shù),相當(dāng)于JVM進(jìn)程與外部進(jìn)程之間的交互。因此,此時(shí)用C語(yǔ)言分配的內(nèi)存直接從操作系統(tǒng)的內(nèi)存中應(yīng)用,與JVM應(yīng)用的大內(nèi)存塊無(wú)關(guān)。
jni和ndk的區(qū)別?
區(qū)別如下:
JNI是Java調(diào)用本機(jī)機(jī)制,這是Java語(yǔ)言本身的特性。它的全名是Java本機(jī)接口,類似于微軟的P/invoke。Net框架,可以使C#或可視化基本.Net調(diào)用C/capi,因此JNI與Android無(wú)關(guān)。在PC上開發(fā)Java應(yīng)用程序,如果運(yùn)行在Windows平臺(tái)上,經(jīng)常使用JNI,比如讀寫Windows注冊(cè)表。
NDK是Google推出的一個(gè)開發(fā)包,幫助Android開發(fā)者用C/C本地語(yǔ)言編寫應(yīng)用程序。它包含C/C頭文件、庫(kù)文件、文檔和示例代碼。
我們可以理解,它是用純C/C編寫的,就像Windows平臺(tái)SDK一樣,但是Android不支持用純C/C編寫的應(yīng)用程序,同時(shí)NDK提供的庫(kù)和函數(shù)非常有限,只處理一些算法效率敏感的問(wèn)題。因此,android123建議初學(xué)者在學(xué)習(xí)JNI之前先學(xué)習(xí)java。