pupuliao
Ubuntu CPU/RAM/流量監控/IO監控
仙本純良讀後感
解決firefox 記憶體消耗過多的方法
在Eclipse透過JNI 跑C/C++ for android-Hello_world篇
繼上一篇(http://www.pupuliao.info/2013/05/在eclipse透過jni-跑cc-for-android-基礎安裝篇/) 安裝好後
要開始進行測試和設定,這部分比較麻煩,(在這裡我卡了很久)
因為是事後結圖,所以有些地方跳過
- 先開啟一個android專案
- 在專案上右鍵選擇 Android Tools->add Native Support
- 就會要你輸入so 名稱
- 確認後就會產生jni 和lib 資料夾
- 其中Android.mk 是 編譯的設定檔,包括要編譯哪些東西,現在用預設的就可以了
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := HelloNDK LOCAL_SRC_FILES := HelloNDK.cpp include $(BUILD_SHARED_LIBRARY
- 之後開始編輯我們的JAVA 程式
package com.example.hellondk; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { private TextView testString; static { System.loadLibrary("HelloNDK"); } public native String helloString(); public native int plus(int a, int b); public native int multiply(int a, int b); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); testString = (TextView) findViewById(R.id.test); String tempString; tempString = helloString() + "\n3+5=" + String.valueOf(plus(3, 5)) + "\n3*5=" + String.valueOf(multiply(3, 5)); testString.setText(tempString); // testString.setText(helloString()); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
其中所有用native 宣告的function 都是等一下要透過C/C++ 來撰寫的程式,所以只需要宣告不需要寫code
- 打開剛剛系統生成的在jni 下的cpp檔
#include
<jni.h> #include <string.h> extern "C" { JNIEXPORT jstring Java_com_example_hellondk_MainActivity_helloString(JNIEnv* env, jobject thiz) { return env->NewStringUTF("My first JNI!"); } JNIEXPORT jint Java_com_example_hellondk_MainActivity_plus(JNIEnv* env, jobject thiz, jint a, jint b) { jint total = a + b; return total; } JNIEXPORT jint Java_com_example_hellondk_MainActivity_multiply(JNIEnv* env, jobject thiz, jint a, jint b) { jint total = a * b; return total; } } 先簡單說明我搞懂的部分
首先因為檔案是使用cpp 所以當在裡面寫C code 的時候 要把程式碼用extern "C"{…} 包起來,如果是.C檔就不需要,不過寫法部台一樣 這部分請自行翻資料
再來是資料型態的部分,所有JAVA的基本變數名稱 都是j+原先變數
例如 int->jint 這部分在http://j796160836.pixnet.net/blog/post/31583827-%5Bandroid%5D-安裝ndk與使用jni呼叫系統底層native的c- 有更近一步的說明
另外在function 名稱的命名上就是 JAVA_[package名稱]_[class名稱]_[function名稱] 所有的 . 改成 _
在function () 中的變數加上預設的兩個變數,這應該是用來在JAVA 和C之間的變數轉換使用 - 接下來開始麻煩的設定
- 專案上按右鍵->內容->建制器->新建->程式->確定
- 依照參考下圖設定,其中名稱隨意,位置和工作目錄就是你安置裝cygwin 的位置,其中引數的內容是重點
–login -c "cd [專案位置] && rm -r obj && $NDK/ndk-build"
要注意的是 位置的斜線和windows 提供的是相反的 請注意
這短程式碼簡單說明就是,移動到專案->刪除前一次編譯資料->開始編譯 ,其中&& rm -r obj 是我自己加進去的 - 接下來請參考這兩張圖設定
- 這樣設定後 每次修改後存檔系統將會自動編譯
- 之後存檔後出現下圖,那就成功了,如果跳出錯誤訊息….去翻資料吧,看看gcc 編譯錯誤說明
- 開始測試吧
在Eclipse透過JNI 跑C/C++ for android-基礎安裝篇
首先,這是一個很複雜的問題…..因為 我搞了好久才搞定
這一篇應該算是經驗談,所以如有錯誤麻煩告知
參考資料:
http://ibuzzlog.blogspot.tw/2012/07/android-jni_20.html
http://zhoujianghai.iteye.com/blog/897212
http://j796160836.pixnet.net/blog/post/31583827-%5Bandroid%5D-安裝ndk與使用jni呼叫系統底層native的c-
環境準備
一開始你要先有eclipse+ android SDK
這是android 程式開發的基礎環境,相信大部分的人都是用這個環境來寫作
我目前是使用eclipse JUNO 中文化版本 教學也以中文化版本為主,英文版 可以看上面參考資料
所需安裝軟體
- androoid NDK 這是要讓android 能透過JNI 來執行C語言時所必需的套件
- eclipse CDT 這是讓eclipse 有C/C++ 的開發環境
- eclipse NDK 這是把NDK 引入eclipse 的套件
- cygwin 這是C/C++的compiler
其中最難搞 的是第四項,其他的很簡單….
安裝androoid NDK
- 至http://developer.android.com/tools/sdk/ndk/index.html 下載最新版本
- 解壓縮到硬碟,可以放在和android SDK 相同資料夾下方便管理
- 搞定
安裝eclipse CDT
- 在eclipse 下開啟 說明->Install New Software
- 在work with 中搜尋http://download.eclipse.org/tools/cdt/releases/indigo,如下徒選想CDT相關的安裝,應該是只要第一個就好,不過我連第二個也順便了 沒差
- 接下來就是和android ADT 的安裝程序相同,就一路 下一部,同意 OK等等…我就不截圖了,因為我都安裝過了….
- 結束後eclipse 會要你重新啟動軟體,選YES
OpenCV SURF 儲存方式
資料來源http://blog.csdn.net/lovenessless/article/details/8077012
//objectKeypoints這些都是cvSeq* 即cvSeq指針
CvFileStorage *fs;
fs = cvOpenFileStorage("data.xml", storage, CV_STORAGE_WRITE);
//open file cvWrite(fs, "objectKeypoints", objectKeypoints);
cvWrite(fs, "objectDescriptors", objectDescriptors);
cvWrite(fs, "imageKeypoints", imageKeypoints);
cvWrite(fs, "imageDescriptors", imageDescriptors);
cvReleaseFileStorage(&fs);
讀取:
//objectKeypoints這些都是cvSeq* 即cvSeq指針
CvFileStorage *fs;
fs = cvOpenFileStorage("data.xml", storage, CV_STORAGE_READ);
objectKeypoints = (CvSeq*) cvReadByName(fs, 0, "objectKeypoints");
objectDescriptors = (CvSeq*)cvReadByName(fs, 0, "objectDescriptors",0);
imageKeypoints = (CvSeq*)cvReadByName(fs, 0, "imageKeypoints",0);
imageDescriptors = (CvSeq*)cvReadByName(fs, 0, "imageDescriptors",0);
cvReleaseFileStorage(&fs);
最近正在研發 JNovelDownloader 的android 版本
wordpress 好用外掛Page Links To
wordpress 在IIS 上的支援性
英雄傳說-碧之軌跡 神★版緹歐版 開箱文
期待已久的碧之軌跡終於到了阿~~本來打算清晨在去拿的(一般來說我這裡7-11物流時間再蓋在半夜兩三點)
不過看到PTT上有人先PO了 所以就等不及殺去拿了(外面暴雨阿~~~)
先來一張外觀圖…
這是在之前國際書展買的 枕芯 是普威爾的~~不過和之前買的80公分版來看 150公分版的 品質比較差