メモ、備忘録、その他雑記を記載します。
ただし、このHPに記載している情報を利用した結果 損失・損害等が発生したとしても筆者は責任を持ちません。
Java Native Interface (JNI) は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他の言語(たとえばCやC++など)で書かれた、実際のCPUの上で動作するコード(ネイティブコード)とを連携するためのインタフェース仕様である。
ここではJNIを使用して、VC6.0で作成したMFC DLL内の関数を呼び出す処理を記載する。
1.javaファイル作成
JniTest.javaを作成。中身を以下のように記載しておく。
public class JniTest {
static {
System.loadLibrary("JniTestDll");
}
// ネイティブ関数1
static native void JniTestFnc1();
// ネイティブ関数2
static native void JniTestFnc2(String str);
public static void main(String args[]) {
// ネイティブ関数1呼び出し
JniTestFnc1();
// ネイティブ関数2呼び出し
JniTestFnc2("JNI test Fnc2!");
}
}
※呼び出すC/C++のDLLファイル名は「JniTestDll.dll」と指定している
※呼び出すC/C++の関数名は「JniTestFnc1」「JniTestFnc2」と指定している
2.javaコンパイル
>javac JniTest.java
3.C/C++ヘッダファイル生成
>javah JniTest
→これで「JniTest.h」が生成される。
4.C/C++(ここではC++)DLLファイル生成
VC6.0でDLLプロジェクトを生成する(今回はMFC使用のプロジェクトを生成)
3.で作成したヘッダファイルをプロジェクトに追加する。
3.で作成したヘッダファイルに合わせた関数の中身を実装する。
プロジェクトの設定で以下のインクルードパス追加する。
C:\Program Files\Java\jdk1.6.0_24\include,C:\Program Files\Java\jdk1.6.0_24\include\win32
※JKDを「C:\Program Files\Java\jdk1.6.0_24」にインストールした場合
Release ビルドして「JniTestDll.dll」を生成し、1.のjavaファイルと同パスに置いておく
5.動作確認
>java JniTest
→4.で実装した処理を行える。
// インクルード
// 要素取得/表示
#pragma warning(disable:4100) // C4100警告非表示
#pragma warning(disable:4786) // C4786警告非表示
#include <map>
// mapオブジェクト定義
std::map<CString, CString> m_mapStr;
// 入力用のエディットコントロール
CEdit m_edtDat;
// 要素巡回
// 要素設定/追加
// mapオブジェクト定義
std::map<CString, CString> m_mapStr;
// 入力用のエディットコントロール
CEdit m_edtDat;
CEdit m_edtKey;
// 要素設定
m_mapStr[_T("な")] = _T("泣きっ面に蜂");
m_mapStr[_T("い")] = _T("犬も歩けば棒に当たる");
m_mapStr[_T("に")] = _T("二度あることは三度ある");
m_mapStr[_T("さ")] = _T("三度目の正直");
m_mapStr[_T("か")] = _T("河童の川流れ");
// 要素巡回
// 要素数表示
int iSize = 0;
iSize = m_mapStr.size();
TRACE(_T("map size[%d]\n"), iSize);
// 巡回表示
std::map<CString, CString>::iterator it;
std::map<CString, CString>::iterator ite = m_mapStr.end();
for (it = m_mapStr.begin(); it != ite; it++) {
TRACE(_T("キー[%s] データ[%s]\n"), (LPCTSTR)(it->first), (LPCTSTR)(it->second));
}
CString strKey;
CString strDat;
m_edtKey.GetWindowText(strKey);
m_edtDat.GetWindowText(strDat);
m_mapStr[strKey] = strDat;
// 要素取得/表示
CString strKey;
CString strDat;
int iCount = 0;
m_edtKey.GetWindowText(strKey);
m_edtDat.GetWindowText(strDat);
iCount = m_mapStr.count(strKey);
if (iCount == 0) {
TRACE(_T("キー[%s]が見つかりませんでした。\n"), strKey);
}
else {
strDat = m_mapStr[strKey];
TRACE(_T("キー[%s] データ[%s]\n"), strKey, strDat);
}
VC6.0のCListCtrlの使い方です。
■準備
ツールからリストビューをダイアログ上へD&Dする。
リストビューのタイプを「レポート」にする
メンバ変数の追加
CListCtrl m_listview;
■拡張スタイル設定
// 拡張スタイル設定
unsigned long ulStyle = m_listview.GetExtendedStyle();
// 1行選択
ulStyle |= LVS_EX_FULLROWSELECT;
// グリッド線表示
ulStyle |= LVS_EX_GRIDLINES;
m_listview.SetExtendedStyle(ulStyle);
■列追加
int g_nColNo = 1;
// m_listview.InsertColumn(インデックス, 列のヘッダー文字列, 配置, 列幅の初期値);
m_listview.InsertColumn(g_nColNo, "列名", LVCFMT_RIGHT, 30);
// m_listview.InsertColumn(g_nColNo, "列名");
g_nColNo++;
■行追加
int g_nRowNo = 0;
int g_nColNo = 0;
CString str;
str = _T("テスト");
// LVITEM lvItem ;
LVITEM lvItem = {0};
lvItem.mask = LVIF_TEXT;
lvItem.iItem = g_nRowNo;
lvItem.iSubItem = g_nColNo;
lvItem.pszText = (LPTSTR)(LPCTSTR)str;
if (g_nColNo == 0) {
// 行の挿入
// 最初の列にアイテム設定
m_listview.InsertItem(&lvItem);
} else {
// 最初以外の列にアイテム設定
m_listview.SetItem(&lvItem);
}
g_nRowNo++;