導航:首頁 > 軟體知識 > 我們編的程序放在哪裡

我們編的程序放在哪裡

發布時間:2022-02-09 21:10:02

1. C語言編寫的程序只能放在一個程序文件里嗎,如果不是,請說一下為什麼,謝謝了

不一定,通常來說,如果程序的代碼量比較少或者說是程序比較小,那麼我們會寫在一個文件里。可如果是大程序的話,幾十個文件都有可能。

2. 老師要求我們編寫一個聊天軟體的程序,請問在哪裡找到創新點如何創新望多給思路,謝謝

開源協議,XMPP。創新點?搞個移動終端的聊天工具,是不是很牛X。。

3. 買來的51單片機晶元 廠家在ROM中存的是什麼 我們編的程序又會存在哪

1.新51片內是空的,廠家不會寫東西。
2.現在的ROM通常是FLASH型的,可以電擦除燒寫至少1千次以上,有些型號可寫1萬次以上。
3.ROM大小隨不同晶元型號而不同,51系列通常在1K位元組到64K位元組不等。
4.我們編寫的程序編譯過後變成2進制代碼寫入晶元中的ROM中
5.51晶元上電後從ROM的0000H單元開始執行指令

4. 我們編寫的程序轉換成機器語言後

1.首先,我們編寫的程序被編譯成exe或者com文件
這些文件都是有PE結構的(COM有點不同),裡面記載了程序的入口地址之類的信息,並非由硬體們執行,而是由CPU來控制合理分配到各個硬體的。
2..由入口地址信息的到指令,再根據CS:IP的變化得到下一指令的位置
3.你如果學過計算機組成原理就知道。裡面講CPU的基本結構裡面有一個「指令解碼部件」,機器的指令是有限制的(指令集),這些指令存儲在哪裡我還真不知道。。。

5. 程序怎麼編寫

簡單的說,編程就是為了藉助於計算機來達到某一目的或解決某個問題,而使用某種程序設計語言編寫程序代碼,並最終得到結果的過程。
計算機雖然功能十分強大。可以供你上網、打游戲、管理公司人事關系等等,但是沒有程序,它就等於是一堆廢鐵,不會理會我們對它下達的「命令」。於是,我們要馴服它,只有通過一種方式——程序,這也是我們和計算機溝通的唯一方式。

那程序到底是什麼呢?
程序也就是指令的集合,它告訴計算機如何執行特殊的任務。

打個比方說,它好比指導你烹調菜品的菜譜或指揮行駛一路到達目的地的交警(或者交通路標)。沒有這些特殊的指令,就不能執行預期的任務。計算機也一樣,當你想讓計算機為你做一件事情的時候,計算機本身並不能主動為我們工作,因此我們必須對它下達指令,而它根本不會也不可能聽懂人類自然語言對事情的描述,因此我們必須使用程序來告訴計算機做什麼事情以及如何去做?甚至對最簡單的任務也需要指令,例如如何取得擊鍵,怎樣在屏幕上放一個字母,怎樣在磁碟中保存文件等等。
這么麻煩,連這些東西編程都要考慮!怪不得人家說編程好難!你錯了,其實許多這樣的指令都是現成的,包含在處理晶元中內置於操作系統中,因此我們不必擔心它們工作,他們都是由處理器和操作系統來完成的,並不需要我們來干預這些過程。

上面講到的計算機本身不會主動的做任何事情。因此我們要通過程序的方式來讓計算機為我們「效勞」。而這個過程就是我們「編」出來的。編程可以使用某一種程序設計語言來實現,按照這種語言的語法來描述讓計算機要做的事情。

我們這里所講的語法和外語中的語法完全兩碼事,這里講的語法只是讀你的程序書寫做出一寫規定而已。

寫出程序後,再由特殊的軟體將你的程序解釋或翻譯成計算機能夠識別的「計算機語言」,然後計算機就可以「聽得懂」你的話了,並會按照你的吩咐去做事了。因此,編程實際上也就是「人給計算機出規則」這么一個過程。
隨計算機語言的種類非常的多,總的來說可以分成機器語言,匯編語言,高級語言三大類。
電腦每做的一次動作,一個步驟,都是按照已經用計算機語言編好的程序來執行,程序是計算機要執行的指令的集合,而程序全部都是用我們所掌握的語言來編寫的。所以人們要控制計算機一定要通過計算機語言向計算機發出命令。

計算機所能識別的語言只有機器語言,即由構成的代碼。但通常人們編程時,不採用機器語言,因為它非常難於記憶和識別。

目前通用的編程語言有兩種形式:匯編語言和高級語言。

匯編語言的實質和機器語言是相同的,都是直接對硬體操作,只不過指令採用了英文縮寫的標識符,更容易識別和記憶。它同樣需要編程者將每一步具體的操作用命令的形式寫出來。

匯編程序的每一句指令只能對應實際操作過程中的一個很細微的動作,例如移動、自增,因此匯編源程序一般比較冗長、復雜、容易出錯,而且使用匯編語言編程需要有更多的計算機專業知識,但匯編語言的優點也是顯而易見的,用匯編語言所能完成的操作不是一般高級語言所能實現的,而且源程序經匯編生成的可執行文件不僅比較小,而且執行速度很快。

高級語言是目前絕大多數編程者的選擇。和匯編語言相比,它不但將許多相關的機器指令合成為單條指令並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等,這樣就大大簡化了程序中的指令。由於省略了很多細節,所以編程者也不需要具備太多的專業知識。

高級語言主要是相對於匯編語言而言,它並不是特指某一種具體的語言,而是包括了很多編程語言,如目前流行的VB、VC、FoxPro、Delphi等,這些語言的語法、命令格式都各不相同。

(1)解釋類:執行方式類似於我們日常生活中的「同聲翻譯」,應用程序源代碼一邊由相應語言的解釋器「翻譯」成目標代碼(機器語言),一邊執行,因此效率比較低,而且不能生成可獨立執行的可執行文件,應用程序不能脫離其解釋器,但這種方式比較靈活,可以動態地調整、修改應用程序。

(2)編譯類:編譯是指在應用源程序執行之前,就將程序源代碼「翻譯」成目標代碼(機器語言),因此其目標程序可以脫離其語言環境獨立執行,使用比較方便、效率較高。但應用程序一旦需要修改,必須先修改源代碼,再重新編譯生成新的目標文件(*.OBJ)才能執行,只有目標文件而沒有源代碼,修改很不方便。現在大多數的編程語言都是編譯型的,例如Visual Basic、Visual C++、Visual Foxpro、Delphi等。
這個問題其實很簡單。前面我們講到,程序是人與計算機進行溝通的唯一方式,因此我們要讓計算機為我們服務,就必須有程序,而程序從哪裡來?當然是由我們編寫出來了。或許你又會問到另一個問題:現在要什麼程序有什麼程序,我幹嘛還要編程呢?這你就錯了,現在的程序雖然很多,需要什麼樣的程序直接到網上不需要很長時間就可以找到類似的,而且有可能就是你所需要的。但是,就好比去買衣服,雖然賣衣服的到處都是,但是哪一件是為你「量身定做」的呢!
程序還能夠做很多事情不同的程序可以完成不同的事情。從大的方面到管理國家的財務,小的方面管理家庭的帳務。

又如,如果你想要你的計算機能播放動畫,那麼你的計算機中也要有相應的動畫播放程序,下面所示的就是一個F1ssh動畫播放器。我們將會在後面的章節具體講述這個程序的編制過程。
隨著計算機的飛速發展,總會有那麼一天將不會編程的人列為「文盲」。你不希望吧?那麼就好好的學習一種程序設計語言吧。

編程會過時嗎

編程會過時嗎?這個問題,讓我先問你一個問題:計算機會消失嗎?這兩者答案是一樣的。知道了計算機會不會消失,就知道了編程會不會過時。

編程工具會過時,而編程卻不會過時

計算機系統由可以看見的硬倒:系統和看不見的軟體系統組成。要使計算機能夠正常的工作,僅僅有硬體系統是不行的,沒有軟倒系統(即沒有程序)的計算機可以說只是—堆廢鐵,什麼事情都幹不了。例如當你撰寫—篇文章的時候,你需要在操作系統中用文字編輯軟體來實現文字的輸入,但如果沒有這些文字輸入軟體的話,你是否想過如何向計算機中輸入文章呢?很難想像出如何在一個沒有任何軟體的計算機(我們稱之為裸機)上進行文字的輸入。而這些軟體其實就是通常我們所說的程序。

編程會過時嗎?我們從另一個角度來考慮這個問題,計算機有——天會消失嗎?如果有一天當世界上所有的事情處理都用不到計算機了,那麼計算機將會很快的消失,那時編程不僅過時了,而且也會隨之消失了。但是計算機會消失嗎?當然不會,如今計算機應用到每一領域,為人類的發展做出了不可估量的貢獻。試想一下如果有一天全世界的計算機突然消失了,那麼這個世界將變成什麼樣子,或許和全世界都停電了一樣恐怖,甚至還會有更大的損失。計算機的存在必須要有軟體系統來維持。因此編程永遠不會、也不可能會過時。

計算機程序設計語言發展到今天,已經從最原始的機器語言發展到如今可視化的集成開發環境,甚至集多種語言在同一開發平台上,像微軟的NET平台。回頭看看程序設計語言的發展史,不難看出對於編程來說,只會出現編程工具的過時,不會出現編程本身的過時。

不斷變化的技術需要不斷變化的程序員

從二十世紀60年代以後,計算機得到了突飛猛進的發展。似乎歷史上沒有任何一門科學的發展速度超過了計算機的發展,無論硬體、軟體、還是網路都以驚人的速度向前發展。計算機的硬體發展速度遵循「摩爾定律」每十八個月速度翻一倍(實際現在已超過了這個速度)。 軟體的發展速度和硬體一樣,二十世紀九十年代中國的軟體業還不是很成熟,而現在大大小小 的軟體企業四處聳立,共享軟體網上隨處可見。不斷發展的技術需要不斷變化的程序員,例如,如今Visual Basic可以快速構Windows下的應用程序,程序設計方面的技術不斷發展著,不斷引進新的概念、新的方法,如從結構化的C開始,當面向對象的思想被提出後,出現了C++,微軟在C++的基礎上為使用戶構建win32應用程序更加方便,推出了Visual C++。這也就需要程序員也要不斷的更新自己的技術。

計算機科學與別的學科很不一樣,不像語言學、歷史學那樣,幾乎是永久不變的東西。計算機科學要求不斷的更新自己的知識,否則很快就會被淘汰,即便是編程亦是如此。

編寫程序是一件很有趣的事情,因為編寫程序可以干很多高級的事情。例如我們在後面的章節中介紹如何使用Visual Basic編寫Flash動畫播放器,以及如何編寫下載軟體管理器等。如果你願意的話,你完全可以編寫出比這些更高級的程序來。

隨著計算機軟體業的發展,誕生了「程序員」這個職位。於是便形成了一種理念,編寫程 序的人就是程序員,因此編程是程序員的事情。但程序員並不是一開始就是程序員,他們也是從現在我們的位置慢慢成為程序員的。

編寫程序是一件很有趣的事情,因為編寫程序可以干很多高級的事情。例如我們在後面的章節中介紹如何使用Visual Basic編寫Flash動畫播放器,以及如何編寫下載軟體管理器等。如果你願意的話,你完全可以編寫出比這些更高級的程序來。

編程也可以作為——種愛好或興趣,如果你對它感興趣學起來就容易多了!因為如果對編程感興趣的話,就會多看些有關方面的書、多編些小程序上機實踐,這些對於學習編程的幫助是非常大的,而且隨著學習的進程不斷的推進就會覺得它並不是很困難,相反卻是很容易的。

總之,在學習編程時一定要堅持不懈,只要有信心、有毅力就一定能學好;不能因為一些似是而非的觀念就動搖了自己的信心。

我們一起來編程

面對擺在面前的計算機該如何操作,相信這個問題已經不再是困擾大家的首要問題了。現在軟體的種類那麼多,在選用的時候「電腦發燒友」的心裡是否也想過有一天自己能編寫一款屬於自己的軟體呢?想學習編程的朋友在選擇程序語言時會不會因為不知道如何選擇而大感頭痛呢?在不知如何下手的時候,朋友們的心中是不是會產生「我是不是可以編程」的思想呢?但是又有哪個程序員是不經過學習就能成功的呢!其實編寫程序並不是人們所想像的那麼困難、那麼復雜,每個有心致力於學習計算機的朋友都是可以嘗試的!

選擇適合自己的程序語言的必要性

目前常用的基本程序語言的種類比較繁多,比較簡單的有:Pascal、c語言、qBasic、 Fortran、Visual Basic等等。但前幾種都是在DOS下進行編程的工具,Visual Basic是在 Windows下進行應用程序設計的編程工具,現在一般的計算機用戶幾乎都不再使用DOS了,因此我們通常會選擇Visual Basic作為初學者的編程工具。Visual Basic是Windows應用程序設計中最容易上手的編程工具,學習步驟也比較容易被初學者接受。對於剛開始學習編程的初學者來說,還是選擇Visual Basic,學習編程語言不能想像著一步登天,一步一個腳印的學習才是最佳方法。

堅定自己學習編寫程序的信心

編寫程序並不是具有專業知識的人員才有的專利,每個學習計算機的人都可以編寫程序,每個人的靈感不同,在編寫程序的思路和作法上又有區別。但共同的想法就是編寫成功的程序。學習編程是一個漫長的過程,其中要付出艱辛的努力和汗水,不過成功者的喜悅又不是別人所能體會的。克服學習中的困難,努力去實踐,要有一個思想:別人能做到的事情自己也一定可以做到。計算機的普及讓更多的人有了學習的機會,也讓更多的人參與到編程人員的隊伍中來,每個人都有編程的權利,機遇給予每個人都是平等的。拿出自己必勝的信心,在編程的道路工勇於進取,相信成功就會在眼前。
三、我可以編程嗎
隨著計算機軟體業的發展,誕生了「程序員」這個職位。於是便形成了一種理念,編寫程 序的人就是程序員,因此編程是程序員的事情。但程序員並不是一開始就是程序員,他們也是從現在我們的位置慢慢成為程序員的。

編寫程序是一件很有趣的事情,因為編寫程序可以干很多高級的事情。例如我們在後面的章節中介紹如何使用Visual Basic編寫Flash動畫播放器,以及如何編寫下載軟體管理器等。如果你願意的話,你完全可以編寫出比這些更高級的程序來。

編程也可以作為——種愛好或興趣,如果你對它感興趣學起來就容易多了!因為如果對編程感興趣的話,就會多看些有關方面的書、多編些小程序上機實踐,這些對於學習編程的幫助是非常大的,而且隨著學習的進程不斷的推進就會覺得它並不是很困難,相反卻是很容易的。

總之,在學習編程時一定要堅持不懈,只要有信心、有毅力就一定能學好;不能因為一些似是而非的觀念就動搖了自己的信心。

四、我們一起來編程

面對擺在面前的計算機該如何操作,相信這個問題已經不再是困擾大家的首要問題了。現在軟體的種類那麼多,在選用的時候「電腦發燒友」的心裡是否也想過有一天自己能編寫一款屬於自己的軟體呢?想學習編程的朋友在選擇程序語言時會不會因為不知道如何選擇而大感頭痛呢?在不知如何下手的時候,朋友們的心中是不是會產生「我是不是可以編程」的思想呢?但是又有哪個程序員是不經過學習就能成功的呢!其實編寫程序並不是人們所想像的那麼困難、那麼復雜,每個有心致力於學習計算機的朋友都是可以嘗試的!

選擇適合自己的程序語言的必要性

目前常用的基本程序語言的種類比較繁多,比較簡單的有:Pascal、c語言、qBasic、 Fortran、Visual Basic等等。但前幾種都是在DOS下進行編程的工具,Visual Basic是在 Windows下進行應用程序設計的編程工具,現在一般的計算機用戶幾乎都不再使用DOS了,因此我們通常會選擇Visual Basic作為初學者的編程工具。Visual Basic是Windows應用程序設計中最容易上手的編程工具,學習步驟也比較容易被初學者接受。對於剛開始學習編程的初學者來說,還是選擇Visual Basic,學習編程語言不能想像著一步登天,一步一個腳印的學習才是最佳方法。

堅定自己學習編寫程序的信心

編寫程序並不是具有專業知識的人員才有的專利,每個學習計算機的人都可以編寫程序,每個人的靈感不同,在編寫程序的思路和作法上又有區別。但共同的想法就是編寫成功的程序。學習編程是一個漫長的過程,其中要付出艱辛的努力和汗水,不過成功者的喜悅又不是別人所能體會的。克服學習中的困難,努力去實踐,要有一個思想:別人能做到的事情自己也一定可以做到。計算機的普及讓更多的人有了學習的機會,也讓更多的人參與到編程人員的隊伍中來,每個人都有編程的權利,機遇給予每個人都是平等的。拿出自己必勝的信心,在編程的道路工勇於進取,相信成功就會在眼前。
一、計算機語言的發展過程

到目前為止,世界上公布的程序設計語言有上千種之多,常用的也有三十來種,為了有21於正確選擇和使用它們,下面我們做一個簡單介紹。

(1)匯編語言:

它是依賴於具體計算機的語言,用它編寫出的程序,執行效率高,但是只在一些特殊要求或特殊的場合才使用它。

(2)高級語言:

大家可能都聽過使用高級語言進行程序設計,但由於對其並不了解,所以總認為這些是很高深的東西。其實並非如此,學習了後面的章節,相信同學會產生編程原來不過如此。

但計算機是不懂得自然語言的(可以理解為高級語言),而高級語言設計出來的程序如何讓計算機去執行呢?其實很簡單,看了下圖後相信大家會明白許多。

現在我們就向大家介紹幾種常見的高級語言:

Fortran語言是科學和工程計算中使用的主要編程語言。目前國內使用版本多數是Fortran 66和Fortran77兩種。Fortran語言的主要缺點是不能直接支持結構化編程。

Cob0l語言是商業數據處理中廣泛使用的語言。由於它本身結構上的特點,使得它能有效的支持與商業處理有關的、范圍廣泛的過程技術。它的缺點是不簡潔。

Algol語言是所有結構化語言的先驅,具有豐富的過程和數據結構。但是,這種語言並沒有被廣泛採用,主要是由於它本身的歷史原因所造成的。

Basic語言是一種解釋執行的會話語言。由於它簡單易學的特點,它被廣泛應用在微型計算機系統中。

PL//1語言是一個用途廣泛的語言。能支持通常的科學工程和商業應用,能描述復雜的數據結構、多重任務處理、復雜的輸入輸出和表格處理等。

Pascal語言是70年代初期發展起來的結構化程序設計語言,具有特別豐富的數據結構類型。它自問世後,得到了眾人的贊賞,也得到了軟體開發者的廣泛支持。Pascal語言已用於科學、工程和系統程序設計中。我們教育部計算機專業教育會議曾把Pascal語言定為計算機專業程序設計語言。

C語言是作為UNIX操作系統的主要使用語言。由於UNIX操作系統的成功,現在C語言也得到了廣泛的使用。C語言是有經驗的軟體工程師設計的,它具有很強的功能,以及高度的靈活性。它和其他的結構化語言一樣,能提供豐富的數據類型、廣泛使用的指針以及—組很豐富的計算和數據處理使用的運算符。

C++語言是C語言的擴充。在1980年,貝爾實驗室的Bjarne Strotstrup博士及其同事開始對C語言進行改進和擴充,最初被稱為「帶類的C」,1983年才取名為C++。以及不斷完善和發展,成為目前的C++語言。一方面,它將C語言作為它的子集,使它能夠與C語言兼容。使許多C語言代碼不經修改就可以為C++語言所用以及用C語言編寫的眾多庫函數和和實用軟體可以直接用於C++語言中;另一方面。C++語言支持面向對象的程序設計這是它對C語言最重要的改進。
這樣可以么?

6. linux下編寫c程序放在哪個文件夾下

第一種方法: 改名:mv hello hello.c 編譯:首先cd到你源文件的那個目錄下,這樣省去了指定絕對路徑的麻煩,比如cd到桌面,然後:gcc hello.c -o hello 運行:./hello 第二種方法: 啟動終端後 gcc /桌面/ hello.c ./a.out 第三種方法: 1.更改所...

7. android studio的編輯程序在哪

1,過程感慨(想直接看教程,請跳過此部分) 在寫具體內容之前,我先說下我搞這個東西的過程,由於導師之前說過要搞個圖像匹配的androi APP,具體就是匹配前後兩張圖片的相似度,類似 安卓5/project/opencvlibrary/opencv-android/3%2F&ts=1436167636&use_mirror=nchc 編譯/asmcvc/article/details/9311573,我上面說了,不一定要用它,win 自帶的 cmd 也可以編譯。如果使用 cygwin,要做好心理准備,下載和安裝它,非常非常的久,文件總體積 20 多G!!!!我是用了9個多小時。 3,---opencv for android 的sdk 下載完成後。打開 該文件夾,sdk/native/libs,裡面有很多平台的文件夾,能在裡面出現的,證明你能夠在下面的 Application.mk 中設置生成對應的架構的 .so文件,我舉個例子,我的是: 在下面介紹的 Application.mk 文件中有一句話 ,它是用來設置生成 對應架構的 .so 文件,我這里是armeabi-7a,如果要生所有的,寫出 :=all,注意,這樣很可能會報錯,錯誤信息是,某種架構找不到,所以,我要你看清楚,上面文件夾裡面有哪些架構,這些 坑是網上找不到,如果你要生成兩種,可以輪著來編譯,第二次的編譯,不同的架構是不會覆蓋的。現在打開 sdk/native/jni,如無意外,裡面肯定有個 文件叫做 OpenCV.mk,它就是我們在 android.mk 腳本文件中要引入 opencv C++庫所要參照的文件。請用記事本 或者Notepad++ 打開。 4,---了解 Android.mk 和 Application.mk 文件的基本內容信息:下面我使用默認的 Android.mk 來說明,和我的例子的 Application.mk 來說明。 它們都是腳本文件。 Android.mk Application.mk 4,編譯 .so 使用你的 as 創建一個新項目,然後在你的 項目的 main 目錄下創建一個一個 jni 文件夾,這樣創建: 創建好了之後,是這樣的: 首先編譯 項目的頭文件 .h,一般編譯出來後,它的名字結構是:包名_類名.h 編譯命令如下,請在你的 as 下面的 Terminal 裡面輸入: SourcePath: D:\work\androidstudio\VisualRecognition\app\src\main\java (絕對路徑) TargetPath: D:\work\androidstudio\VisualRecognition\visual\src\main\jni (絕對路徑) TargetClassName: com.yf.visualrecognition.UnityPlayerActivity (你的包名+類名) 格式: javah -d ${SourceFile} -classpath ${TargetPath} ${TargetClassName} 控制台指令:javah -d D:\work\androidstudio\VisualRecognition\visual\src\main\jni -classpath D:\work\androidstudio\VisualRecognition\app\src\main\java io.github.froger.jni.MyActivity 然後在你的jni 文件夾下面 分別創建 Android.mk 、Application.mk 和你要編譯的 .cpp 或者.c 文件,前兩個的 內容可以模仿我上面介紹的, .cpp 我這里提供一個。 Android.mk 、Application.mk 、ImgFuncpp 分別如下,util.c 是空文件,之所以創建它是為了避免另外一個 bug,這不說: Android.mk 文件如下 LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)OPENCV_LIB_TYPE:=STATICifeq ("$(wildcard $(OPENCV_MK_PATH))","")include E:\OpenCV-3.0.0-android-sdk-1\OpenCV-android-sdk\sdk\native\jni\OpenCV.mkelseinclude $(OPENCV_MK_PATH)endifLOCAL_MODULE := ImgFunLOCAL_SRC_FILES := ImgFun.cppLOCAL_LDLIBS += -lm -lloginclude $(BUILD_SHARED_LIBRARY) Application.mk 文件如下 APP_STL := gnustl_staticAPP_CPPFLAGS := -frtti -fexceptionsAPP_ABI := armeabi-v7a #這句是設置生成的cpu指令類型,提示,目前絕大部分安卓手機支持armeabi,libs下太多類型,編譯進去 apk 包會過大APP_PLATFORM := android-8 #這句是設置最低安卓平台,可以不弄 ImgFun.cpp 文件如下 1 #include <io_github_froger_jni_MyActivity.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <opencv2/opencv.hpp> 5usingnamespace cv; 6 IplImage * change4channelTo3InIplImage(IplImage * src); 7 8extern"C" { 9JNIEXPORT jintArray JNICALL Java_io_github_froger_jni_MyActivity_ImgFun(10 JNIEnv* env, jobject obj, jintArray buf, int w, int h);11JNIEXPORT jintArray JNICALL Java_io_github_froger_jni_MyActivity_ImgFun(12 JNIEnv* env, jobject obj, jintArray buf, int w, int h) {1314 jint *cbuf;15 cbuf = env->GetIntArrayElements(buf, false);16if (cbuf == NULL) {17return0;18 }1920 Mat myimg(h, w, CV_8UC4, (unsigned char*) cbuf);21 IplImage image=IplImage(myimg);22 IplImage* image3channel = change4channelTo3InIplImage(&image);2324 IplImage* pCannyImage=cvCreateImage(cvGetSize(image3channel),IPL_DEPTH_8U,1);2526 cvCanny(image3channel,pCannyImage,50,150,3);2728int* outImage=newint[w*h];29for(int i=0;i<w*h;i++)30 {31 outImage[i]=(int)pCannyImage->imageData[i];32 }3334int size = w * h;35 jintArray result = env->NewIntArray(size);36 env->SetIntArrayRegion(result, 0, size, outImage);37 env->ReleaseIntArrayElements(buf, cbuf, 0);38return result;39}40}4142 IplImage * change4channelTo3InIplImage(IplImage * src) {43if (src->nChannels != 4) {44return NULL;45 }4647 IplImage * destImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);48for (int row = 0; row < src->height; row++) {49for (int col = 0; col < src->width; col++) {50 CvScalar s = cvGet2D(src, row, col);51 cvSet2D(destImg, row, col, s);52 }53 }5455return destImg;56 } 上面 .cpp 文件的有幾句話要說明下,注意 .c 文件和 .cpp 文件是不一樣的: 1,請用 extern "C" { } 包住 你要你的 c++ 函數體的定義和裡面的變數,函數聲明可以在外面。 2,JNIEXPORT jintArray JNICALL Java_io_github_froger_jni_MyActivity_ImgFun(JNIEnv* env, jobject obj, jintArray buf, int w, int h); 3,jintArray 是你定義的函數的返回值,我這里的是int數組,它在類型的前面有一個 j ,如果是字元串,那麼就是 jstring,數組加上Array; 4,JNICALL Java 這句不變,所有都一樣,注意java的 j 是大寫; 5,io_github_froger_jni 這里是你的包名; 6,MyActivity 你的類名,要引用這個這里C++函數的類名; 7,ImgFun 是你要在java中調用的函數名字,哪些不用直接被調用的,不用寫; 8,JNIEnv* env, jobject obj, 這個固定不變,第一個的意思是虛擬機引用,第二個是項目; 9,jintArray buf, int w, int h 函數的參數。 好了,上面該介紹的已經介紹完了,接下來是編譯 .so 的正式操作(我這里使用cmd做例子,因為它更簡單操作,cygwin也可以)。 你可以在 as 的 cmd 中或者 系統的 cmd框中實現編譯,首先使用命令進入到當前的 jni 文件夾的 目錄,例如,我的是 D:asproject/JniDemo/app/main/jni,然後使用命令 ndk-build,(使用ndk-build命令這一步,需要你已經配置好了 ndk 環境,請參照網路上面的教程)然後回車,如無意外,將會生成如下文件: 其中的 .so 文件就是我們所需要的,現在打開你項目app下的 build.gradle 文件,在 android{} 裡面加入: sourceSets {main() {jniLibs.srcDirs = ['src/main/libs']}} 這樣是為了使用 .so文件,上面我們僅僅是生產! OK,到這里基本大功告成了,不過,筆者我就是在這一步之後,運行程序的時候,出現的簡單的致命的 bug,導致我找了近2星期,現在想起來真是蠢.............. 5,遇到的關鍵問題及其解決方法 運行程序,出現,如下錯誤,這里聲明下,不僅僅是 opencv2/opencv.hpp,還可能是其他的 hpp。 出現的原因: 原來是這樣的,android studio 在我們編譯完 .so 文件後,我們在Android.mk 文件中設置引入的opencv 函數庫,是已經被編譯進去.so 動態庫裡面了的,而我們編譯所需要的 cpp 文件,它在 jni 文件夾呢,自然就沒有 opencv 庫可依賴,所以。 解決方法: 在你編譯完.so 文件後,就可以把 cpp 或者 c 文件裡面的內容 注釋或者刪除了,不然在你運行程序的時候就會拋出頭文件找不到的錯誤,哎,真是辛酸淚,這樣一個 bug 搞了我 那麼多時間,不過還好,還是解決了。 6,實現效果截圖。 1package io.github.froger.jni; 2 3import android.app.Activity; 4import android.graphics.Bitmap; 5import android.graphics.drawable.BitmapDrawable; 6import android.os.Bundle; 7import android.view.View; 8import android.widget.Button; 9import android.widget.ImageView;1011publicclass MyActivity extends Activity {12/** Called when the activity is first created. */13 ImageView imgView;14 Button btnNDK, btnRestore;15publicstaticnativeint[] ImgFun(int[] buf, int w, int h);16static {17 System.loadLibrary("ImgFun");18 }19 @Override20publicvoid onCreate(Bundle savedInstanceState) {21super.onCreate(savedInstanceState);22 setContentView(R.layout.activity_my);2324this.setTitle("使用NDK轉換灰度圖");25 btnRestore = (Button) this.findViewById(R.id.btnRestore);26//btnRestore.setText(ImgFun());27 btnRestore.setOnClickListener(new ClickEvent());28 btnNDK = (Button) this.findViewById(R.id.btnNDK);29 btnNDK.setOnClickListener(new ClickEvent());30 imgView = (ImageView) this.findViewById(R.id.ImageView01);31 Bitmap img = ((BitmapDrawable) getResources().getDrawable(32 R.drawable.ic_launcher)).getBitmap();33 imgView.setImageBitmap(img);34 }3536class ClickEvent implements View.OnClickListener {37publicvoid onClick(View v) {38//btnRestore.setText(ImgFun());39if (v == btnNDK) {40long current = System.currentTimeMillis();41 Bitmap img1 = ((BitmapDrawable) getResources().getDrawable(42 R.drawable.ic_launcher)).getBitmap();43int w = img1.getWidth(), h = img1.getHeight();44int[] pix = newint[w * h];45 img1.getPixels(pix, 0, w, 0, 0, w, h);46int[] resultInt = ImgFun(pix, w, h);47 Bitmap resultImg = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);48 resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);49long performance = System.currentTimeMillis() - current;50 imgView.setImageBitmap(resultImg);51 } elseif (v == btnRestore) {52 Bitmap img2 = ((BitmapDrawable) getResources().getDrawable(53 R.drawable.ic_launcher)).getBitmap();54 imgView.setImageBitmap(img2);55 }56 }57 }585960 }

8. 程序是如何編寫的

設計環境 程序也就是指令的集合,它告訴計算機如何執行特殊的任務。

閱讀全文

與我們編的程序放在哪裡相關的資料

熱點內容
奶粉代理哪個品牌最好 瀏覽:967
技術類賬號有哪些 瀏覽:111
從哪裡能查出車輛凍結信息 瀏覽:112
c管家安裝需要在什麼程序上 瀏覽:353
蘋果手機怎麼設置國外代理 瀏覽:387
2k14如何交易科比 瀏覽:221
數控操機怎麼在程序里找刀 瀏覽:577
登錄時信息要多少個字 瀏覽:589
紅色基因產品有哪些 瀏覽:770
小米手機信息驗證碼怎麼全部刪除 瀏覽:778
怎麼看職業技術學院什麼時候開學 瀏覽:584
房東代理直租什麼意思 瀏覽:755
射頻遙控數據終端是什麼 瀏覽:400
南寧的和平批發市場有哪些 瀏覽:478
張家港租房信息一般哪個網站 瀏覽:241
紅色產品手機怎麼拍 瀏覽:627
淘寶雙方達到一致交易怎麼取消 瀏覽:105
哪裡可以買到交易貓 瀏覽:64
獨任審判需要什麼程序 瀏覽:664
精選聯盟的產品怎麼在直播間賣 瀏覽:661