NDK 環境作成 – 1
まだ完全ではないが,何とか NDK のサンプルのビルド,実行までは可能となったので,
ここまでで参考にした本は,Android アプリ開発超入門,Android NDK 入門.
他にも NDK 関係の本は購入したが,開発環境の構築に関してはよくわからなかった.
PC 環境としては,Virtusl PC で Win XP を用意.メモリは 1 GB でも動作するが,1.2 GB 以上ある方が良い?
メモリ 1 GB では,エミュレータでのテストでメモリ不足となってしまったことがあった.
Eclipse のインストールには,Pleiades – Eclipse プラグイン日本語化プラグインを利用.
Pleiades All in One 4.2.2a.v20130303
その中の Ultimate 32 bit Full Edition
注意しなければならないのが,zip の展開先フォルダの指定.
WIn XP で,zip を c ドライブのルートに置いて,展開ウィザードの展開先を c:\ に指定した.
展開には 30 分以上かかった(45 分位)?
ここまでで,「ファイル」-「プロジェクト」から,「Hello World C++ プロジェクト」-「MinGW」で exe が生成できる.
「ヘルプ」-「新規ソフトウェアのインストール」でADT プラグインを組込み.
作業対象に,http://dl-ssl.google.com/android/eclipse/ と入力.
「開発ツール」と「NDK プラグイン」をチェックしてインストール.
Eclipse の再起動後,SDK の場所を指定するか,ダウンロードしてインストールできる.
これで,「Android アプリケーション プロジェクト」が生成できるようになる.
デフォルト状態でのスケルトンの生成では,API 8 のインストールが要求された.
出来上がったスケルトンの状態では,ビルドできない.
MainActivity.java の R の部分がエラーとなっている.
「ウィンドウ」-「パースペクティブのカスタマイズ」で「Android SDK および AVD マネージャー」を追加.
よくわからないが,SDK Manager を起動してインストールされてないとなったものをインストール.
Android SDK Build-tools
4.2.2 ARM , x86 , MIPS
Google USB Driver
Eclipse の再起動で,R の部分のエラー表示はなくなりビルド可能となった.
エミュレータを作成して,動作を確認.
Java での Android 開発環境ができた.
他にも,SDK Manager を利用して,幾つかの API をインストール.
Fedora をインストール
Mac の VirtualBox に Fedora をインストール.
最初,WIn 7 の VirtualBox に Ubuntu をインストールした.
インストール直後は動作していたが,そのうち起動時にブルースクリーンとなることがあった.
以前 Android 環境を入れた時もそうだったので,VirtualBox との相性か?
ホームにできるフォルダが日本語名となるため検索すると,
ホームディレクトリのフォルダ名を日本語から英語に変更するには
2013/06/26
環境を作成した時点では,うまく Windows Network が見えなかったが,…
今開いてみたら見える様になっていた.
2013/06/27
デスクトップをカスタマイズしようと,ここを参考に GNOME Shell を有効に,…
インストール後,再起動して,「GNOME Shell 拡張機能」の場所がわからなかったので,
「アクティビティ」-「アプリケーションの表示」-「Tweak Tool」.
「検索ワードを入力…」に “Tool” と入力するか,「アクセサリ」で絞った方がはやいかも.
python.exe CreateProcess error=14001
Win XP 環境に,Titanium Studio をインストール.
Android SDK などの環境のパスなどを設定.
プロジェクトを作成して,スケルトンのままで実行すると,
FastDev launching error
Cannot run program “C:\Program Files\Appcelerator\Titanium Studio\plugins\
com.appcelerator.titanium.python.win32_1.0.0.1338515509\python\python.exe”:
CreateProcess error=14001, ?±??A?v???P?[?V??????\?¬?a?3?μ?-??¢????A?A?v???P?
検索すると VC の再頒布パッケージが必要とのこと.
イベントビューアを見ると確かに,
面倒だったので,VC 9 と SP1 の両方をインストールして,起動する様になった.
2013/06/25
スケルトンの状態で,「Run As」-「Android Emulator」とすると,
Titanium Command-Line Interface, CLI version 3.1.1, Titanium SDK version 3.1.1.GA
Copyright (c) 2012-2013, Appcelerator, Inc. All Rights Reserved.
[ERROR] : “Missing Java SDK. Please make sure Java SDK is on your PATH
[ERROR] Application Installer abnormal process termination. Process exit value was 1
どこの部分を設定するのかよくわからなかったが,
インストール手順などを検索すると,環境変数を指定していない.
どれが必要なのかよくわからないが,
%ANDROID_SDK% , %JAVA_HOME% の追加と,%PATH% にそれぞれの bin や tools などを追加.
これで,Emulator は起動する様にはなったが,うまく動作してない?それとも遅いだけ?
SMT-i9100 の接続
以前調べた時,実機との接続のためのドライバがないことは知っていた.
が,あまりにも Emulator では遅かったので,…
参考にさせてもらったのはここ.
Android 開発のためのテスト環境を Virtual PC 内の WinXP に作成している.
SDK もその環境にはインストールしてある.
そのため,ゲストの SDK のフォルダを共有してインストールすることにした.
1. ホストの Win7 x64 で先ず接続するために.
android_winusb.inf に SMT-i9100 用を追加.
[Google.NTamd64]
%SingleAdbInterface% = USB_Install, USB\VID_04E8&PID_9102
%CompositeAdbInterface% = USB_Install, USB\VID_04E8&PID_9102&MI_01
後で,ゲストの XP にもドライバを入れる必要があるので,[Google.NTx86] にも追加.
2. ドライバのインストールで,変更した inf を指定.
デバイスマネージャで Android Device – Android Composite ADB Interface となっていれば良いみたい.
3. 今度はゲストの XP に.メニューの「USB」-「SMT-i9100」 で接続.
ホストの時と同様に inf を指定してドライバをインストール.
Titanium Studio で,スケルトンのプロジェクトを開いて,Android Device として実行すると何とか起動した.
2013/06/27
KitchenSink をダウンロードして,Mobile Web Preview in Browser は動作するが
Android Device とすると,
Titanium Command-Line Interface, CLI version 3.1.1, Titanium SDK version 3.1.1.GA
[INFO] : Running build process: python “C:\…\mobilesdk\win32\3.1.1.GA\android\builder.py” …
[INFO] logfile = C:\…\Titanium_Studio_Workspace\KitchenSink\build.log
[ERROR] : Build process exited with code 1
[ERROR] : Project failed to build after 7s 33ms
よくわからないが,Android 3.0 (API 11) のインストールで通る様になった?
けど,実機 SMT-i9100 では動作しない?
PC ,デバイス共に再起動で,起動時の Titanium のロゴまでは表示された.
途中で止まったようになったので,もう一回デバイスを再起動して,メニューから表示するとできた.
MinGW インストール
Android の開発環境を用意しようとしていて,
Pleiades – Eclipse プラグイン日本語化プラグイン をインストールまでは行っていた.
pleiades-e4.2-ultimate-32bit-jre_20130303.zip
以前インストールした(展開)時は,ファイル名の長さの制限で引っかかって,インストールまでで中断していた.
が,よくわからない.
その中に MinGW があったので,そこから,…
~\MinGW\bin に gcc.exe などがあったので,
テスト用の Hello.c を作成して,コンパイルすると a.exe はできた.
c:\~\My Documents\Temp\Test> type T_Hello.c
#include <stdio.h>
int main (void) {
printf(“hello\n”) ;
return 0 ;
}
c:\~\My Documents\Temp\Test> C:\pleiades\eclipse\mingw\bin\gcc.exe T_Hello.c
c:\~\My Documents\Temp\Test> dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 7C5D-D1D9 です
c:\~\My Documents\Temp\Test のディレクトリ
2013/06/20 14:19 .
2013/06/20 14:19 ..
2013/06/20 14:19 49,177 a.exe
2013/06/20 14:07 78 T_Hello.c
2 個のファイル 49,255 バイト
2 個のディレクトリ 114,850,582,528 バイトの空き領域
c:\~\My Documents\Temp\Test> a
hello
これでは使い勝手が悪いので調べると,MSYS が使えそう.
けど MinGW フォルダには見当たらない.
MinGw Getting Started のリンク mingw-get-inst より,もう一度インストール.
MinGW Shell で開いてくるのは,C:\MinGW\msys\1.0\home\Iwao
C:\>tree \MinGW\msys\1.0\home
フォルダ パスの一覧
ボリューム シリアル番号は 7C5D-D1D9 です
C:\MINGW\MSYS\1.0\HOME
└─Iwao
└─Temp
└─Test
MSYS コンソール内で,
ネットワーク上のファイルは,//DevXP/C_Drive/…/c_src/
ls c:
ls \\
ls \\\\DevXP\\C_Drive
\\ と / は,等価?
more ではなく less
C++ のコード(std::cout<<“Hello CPP” << std::endl ;)をコンパイルすると,
$ gcc testcpp.cpp
C:\~\Temp\ccYlk1I9.o:testcpp.cpp:(.text+0x19): undefined reference to `std::cout’
C:\~\Temp\ccYlk1I9.o:testcpp.cpp:(.text+0x1e): undefined reference to `std::basic_ostream …
…
C:\~\Temp\ccYlk1I9.o:testcpp.cpp:(.text+0x6a): undefined reference to `std::ios_base::Init::Init()’
collect2: ld はステータス 1 で終了しました
gcc ではなく,g++ を利用するみたい.
また,出来上がった C++ の exe は,MSYS コンソールの外では,
—————————
TestCPP.exe – コンポーネントが見つかりません
—————————
libgcc_s_dw2-1.dll が見つからなかったため、このアプリケーションを開始できませんでした。
アプリケーションをインストールし直すとこの問題は解決される場合があります。
—————————
OK
—————————
2013/06/25
Eclipse を起動して,
「ファイル」-「新規」-「C++ プロジェクト」,「Hello World …」-「MinGW GCC」.
ビルド,実行で,
CPoint と CGPoint
以前作成した MemoryStatus クラスを利用して,Win , iOS で書いてみた.
MemoryStatus の配列として,MemoryStatusAry を作成.
また,float の配列をそれぞれの点配列に変換する ::GraphGetPoint を用意.
Win
void CMemSSDView::OnPaint()
{
CPaintDC dc(this);
CRect rect ;
GetClientRect(rect) ;
{
std::vector<float> grphF = MemSA.GetGraph(MemoryStatusAry::WinPhysF) ;
std::vector<float> grphT = MemSA.GetGraph(MemoryStatusAry::WinPhysT) ;
std::vector<float> grphP = MemSA.GetGraph(MemoryStatusAry::WinPageF) ;
std::vector<CPoint> pntsF = ::GraphGetPoint(grphF,rect) ;
std::vector<CPoint> pntsT = ::GraphGetPoint(grphT,rect) ;
std::vector<CPoint> pntsP = ::GraphGetPoint(grphP,rect) ;
{
CPen penGreen(PS_SOLID,1,RGB(0,192,0)) ;
CPen* oldPen = dc.SelectObject(&penGreen) ;
dc.Polyline(&pntsF[0],pntsF.size()) ;
CPen penRed(PS_SOLID,1,RGB(192,0,0)) ;
oldPen = dc.SelectObject(&penRed) ;
dc.Polyline(&pntsT[0],pntsT.size()) ;
CPen penBlue(PS_SOLID,1,RGB(0,0,192)) ;
oldPen = dc.SelectObject(&penBlue) ;
dc.Polyline(&pntsP[0],pntsP.size()) ;
dc.SelectObject(oldPen) ;
}
}
}
iOS
- (void)drawRect:(CGRect)rect
{
_context = UIGraphicsGetCurrentContext() ;
{
std::vector<float> grphP = MemSA.GetGraph(MemoryStatusAry::MacPFree) ;
std::vector<float> grphA = MemSA.GetGraph(MemoryStatusAry::MacInact) ;
std::vector<float> grphW = MemSA.GetGraph(MemoryStatusAry::MacWired) ;
std::vector<CGPoint> pntsP = ::GraphGetPoint(grphP,rect) ;
std::vector<CGPoint> pntsA = ::GraphGetPoint(grphA,rect) ;
std::vector<CGPoint> pntsW = ::GraphGetPoint(grphW,rect) ;
{
[self setColor_r:0 g:192 b:0] ;
CGContextAddLines (_context,&pntsP[0],pntsP.size()) ;
CGContextStrokePath (_context) ;
[self setColor_r:0 g:0 b:192] ;
CGContextAddLines (_context,&pntsA[0],pntsA.size()) ;
CGContextStrokePath (_context) ;
[self setColor_r:192 g:0 b:0] ;
CGContextAddLines (_context,&pntsW[0],pntsW.size()) ;
CGContextStrokePath (_context) ;
}
}
}
UIView のサイズ
MFC の CWnd::GetClientRect にあたるもの?
drawRect の引数の rect
self.bounds , self.frame
画面の向きに対して自動的に反映させるには
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ;
MoveTo , LineTo
CGContextMoveToPoint , CGContextAddLineToPoint
CGPathMoveToPoint , CGPathAddLineToPoint
Polyline
CGContextAddLines
CGPathAddLines
MetaFile と MemoryDC
ODMMeta.cxx , ODrawDcM.hxx
pDC->IntersectClipRect(imgRect) ;
MetaFile mf ;
mf.SetFileName(imgN) ;
// mf.Draw(pDC,imgRect) ;
{
MemoryDC memDC ;
CRect mRect(CPoint(0,0),imgRect.Size()) ;
memDC.Init(CRect(mRect).Size()) ;
{
int colIndex = COLOR_3DFACE ;
COLORREF clrC = ::GetSysColor(colIndex) ;
CDC* mdc = memDC.GetMemoryDC() ;
CRect clrR = mRect ;
mdc->FillSolidRect(clrR,clrC) ;
mf.Draw(mdc,mRect) ;
}
memDC.Draw(pDC,imgRect) ;
memDC.Term() ;
}
ZipFold と WinXP での zip
zae などの様に,zip 内のファイル名に 5c などの文字を含まない様にしている場合は OK .
つまり,zip のファイル名として 5c が含まれていても問題ない?
→ ZipFold が MBCS のためか? 単なるバグか?
→ CharFile.hxx GetFileAttribute の “\” 削除部分のバグ.
上は GetFileAttribute のバグが原因.
Shell を使用した zip クラスの動作では,5c が含まれていてもそれなりに動作する.
UNICODE 文字はうまくなさそう.
あるフォルダ以下の圧縮で,フォルダ名が 5c 文字で終わっている場合,
MFC 6 MBCS では,CFileFind::GetFilePath の影響を受ける.
::FolderF_EnumFiles 以下の部分で,新しく定義した iFileFind を使用する様に変更.
VC 7 で error C2664 std::vector
VC 6 では通っていたが,VC 7 でエラーとなってそのままだったコード.
std::vector <void*> voidPtrs(1024,NULL) ;
c:\Program Files\Microsoft Visual Studio .NET\Vc7\include\vector(124) : error C2664:
‘std::vector >::_Construct_n’ : 2 番目の引数を ‘int’ から ‘void *const & ‘ に変換できません。
理由: ‘int’ から ‘void *const ‘ へは変換できません。
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
c:\Program Files\Microsoft Visual Studio .NET\Vc7\include\vector(109) :
コンパイルされたクラスのテンプレートのインスタンス化 ‘void std::vector<_Ty,_Ax>::_Construct(_Iter,int,std::_Int_iterator_tag)’ の参照を確認してください
with
[
_Ty=void *,
_Ax=std::allocator,
_Iter=int
]
c:\~\~.cpp(206) : コンパイルされたクラスのテンプレートのインスタンス化
‘std::vector<_Ty,_Ax>::vector(_Iter,int)’ の参照を確認してください
with
[
_Ty=void *,
_Ax=std::allocator,
_Iter=int
]
(void*) とすることで通るみたい.
std::vector <void*> voidPtrs(1024,(void*)NULL) ;
3D ビューア
対応形式は,3DS , OBJ , STL , DXF (3D FACE) , VRML 1 .
テスクチャは,BMP , TGA , 一部の JPG .
i3DV.2013.04.26.zip
2013/05/08
i3DV.2013.05.08.zip
2013/05/10
i3DV.2013.05.10.zip
MDI のステータスバー
以下の情報と,The MFC Answer Book とで.
すべての MDI 子ウィンドウのステータス バーを作成する方法
How to Create a Status Bar in Every MDI Child Window
https://www.betaarchive.com/wiki/index.php?title=Microsoft_KB_Archive/121946
static UINT indicators[] = { ID_INDICATOR_MDI } ; として,ID をシンボルブラウザで追加.
ビルド,実行すると,CChildFrame::OnCreate のステータスバーの Create で失敗.
String Table で定義されてないとダメな様で適当な文字列を追加.
ビューで,OnUpdateIndicatorMDI を追加(表示されないメニューに ID を追加して ClassWizard で).
pCmdUI->SetText(_T(“ステータスバーに表示する情報”)) ;
これで実行すると,追加した文字列の幅で表示された.
CChildFrame::OnCreate の,
ステータスバーを生成した後,SetPaneInfo(0,ID,SBPS_STRETCH,0)
これにより,ウィンドウ幅いっぱいに.
幅は広がったが表示される文字列は,128 文字まで?
MFC と STL – 2
Xml_E で,MFC を使用しない様に変更中.
XML のデータを用意して,以下の様に単純に 100 個の配列にコピーする時間を計測しようとした.
ElapseTick et ;
CArray xmlAry ; // std::vector xmlAry ;
for (int index=0 ; index<100 ; index++) {
xmlAry.Add(Xml_Data) ; // xmlAry.push_back(Xml_Data) ;
}
CString etStr = ::ToString(et.GetElapse()/1000.0) ;
m_CtrlResult.SetWindowText(etStr) ;
データによっては期待した結果(MFC 版と同等またはそれより高速)が出たが,
この SVG を使用してメモリが少ない環境では極端に遅くなってしまった.
そこで,それぞれのサイズを調べてみた.
VC 6 | VC 7 | VC 8 | VC 9 | VC 10 | VC 8 Debug | VC 9 Debug | VC 10 Debug | VC 8 x64 | VC 9 x64 | VC 10 x64 | VC 9 x64 Debug | VC10 x64 Debug | Xcode 64 Debug | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
CString | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 8 | 8 | 8 | 8 | |
CArray | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 40 | 40 | 40 | 40 | 40 | |
tstring | 16 | 28 | 28 | 28 | 28 | 32 | 32 | 32 | 40 | 40 | 40 | 48 | 48 | 8 |
vector | 16 | 16 | 16 | 24 | 16 | 20 | 20 | 20 | 32 | 48 | 32 | 40 | 40 | 24 |
Xml_E | 68 | 92 | 92 | 108 | 92 | 108 | 108 | 108 | 152 | 184 | 152 | 184 | 184 | 72 |
tstring は,std::string または std::wstring .
vector は, <int> のサイズ.sizeof (std::vector<bool>) は vector<int> などより大きくなることがあるみたい.
Xml_E の MFC 版のデータメンバは,
CString Name , CString Text , CArray<Xml_Attribute,Xml_Attribute> Attribute , CArray<Xml_E,Xml_E> Child .
STL 版は tstring と std::vector に置換えた.
MFC Xml_Attribute | 12 | 4 + 4*2 |
MFC Xml_E | 52 | 4 + 4*2 + 20*2 |
STL Xml_Attribute | 36 | 4 + 16*2 |
STL Xml_E | 68 | 4 + 16*2 + 16*2 |
2013/04/22
SVG の全要素数は 5,557 ,属性は 19,103 .MFC 版では 518,200 ,STL 版では 1,065,584 となる.
つまり 50 M ~ 100 M 位が一時的に必要となってしまっていた(200 個にした時もあり).
ループ部分を 2 重ループとして,内側を 10 で 10 個の配列が必要となる様に改良.
時間を計測すると環境にもよるがほぼ同等の結果が得られた,
T5400 では MFC 6 秒と STL 3 秒.
DImage の利用
Shell Extension を利用した画像表示.ダイアログにファイルをドロップすると表示する様に.
1. CStatic を用意.ピクチャコントロールを配置して ClassWizard で変数を追加.
2. DImageS の領域を確保.通常はヘッダに.
3. OnDropFiles で
// CString dropFile = …. ;
ImageS.SetFileName(dropFile) ;
ImageS.Draw(&m_Image) ;
{
m_Image.ShowWindow(SW_HIDE) ;
m_Image.ShowWindow(SW_SHOW) ;
}
// …
4. OnPaint で
ImageS.Draw(&m_Image) ;
DImage では,ImageDMF が追加される.
DImage.zip
::SetCursor
使い方がわからなかったので,
最初,こんな感じにしたら,SetCursor 直後は変更されるが保持されない.
void CVEyeCSView::OnVEyeDrag()
{
VEyeChgView::OnVEye() ;
if (GetEyeChg().CanMouseEyeChange()) {
::SetCursor(m_DragEye) ;
}
else {
::SetCursor(NULL) ;
}
}
SetCursor 直後と言ってもデバッガでブレイクしている状態でないと確認はできない.
CWaitCursor と似た様な動作となる.
やりたかったのは,
BOOL CVEyeCSView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (nHitTest == HTCLIENT) {
if (GetEyeChg().CanMouseEyeChange()) {
::SetCursor(m_DragEye) ;
return TRUE ;
}
}
return VEyeChgView::OnSetCursor(pWnd, nHitTest, message);
}
The MFC Anser Book より
vcompd.dll が見つからなかったため …
MFC と STL
MFC | STL |
---|---|
CString::Right など | string::substr |
LPCTSTR | string::c_str |
LPTSTR CString::GetBuffer() | - |
CString::ReverseFind() | string::rfind |
- | string::find_last_not_of |
Xcode で,#include “..\Test\Test.h” は通らない?
バックスラッシュではなく通常のスラッシュ ‘/’ とすれば OK (VC 6 でも通る).
2013/03/04
CString::GetBuffer() にあたる部分を,string::begin() とすると VC 6 では通る(たまたま通っているだけ).
#ifdef _MBCS
{
// tstring tmpStr = str + _T(“”) ;
// _tcsrev(tmpStr.begin()) ;
std::vector tmpStr ;
tmpStr.resize(str.length()+1) ;
_tcscpy(&tmpStr[0],str.c_str()) ;
_tcsrev(&tmpStr[0]) ;
// ….
}
#endif
昨日立ち読みした方法に改良.確かこんなんだったと思う.
2013/03/07
VC 7 でコンパイルすると,
c:\…\Test.cpp(45) : error C2664: ‘_tcsrev’ :
1 番目の引数を ‘std::basic_string::iterator’ から ‘char *’ に変換できません。
SMT-i9100 で 3D データ表示
HD Model Viewer や Pro 版 を使用すれば,スクリーンショットにある様に 3D データが表示できる.
対応している形式のモデルとテクスチャを USB 経由などでコピーすると同様に表示できる事も確認した.
このアプリを使用して,PC から Dropbox 経由でデバイスにダウンロードして表示する手順.
1. 対象のモデルとテクスチャを同じフォルダにまとめる.
2. zip など 1 つのファイルとなる様な形式に変換.
これはデバイス上にダウンロードする手順を容易にするため.
3. Dropbox のフォルダに登録(コピー).
4. デバイスで,Dropbox のファイルをダウンロード.
5. zip を解凍.この時ダウンロードした所か,展開先フォルダを指定できるアプリが便利.
6. HD Model View を起動して,対象のファイルを開く.