- PR -

JNIについて

投稿者投稿内容
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-12-07 14:33
こんにちは。

引用:

ヒロピンさんの書き込み (2005-12-07 14:18) より:

VC++でコンパイルしたところ下記のようなエラーが出ました。

othersystem.h(2) : fatal error C1083: インクルード ファイルがオープンできません。
'jni.h': No such file or directory

何かパスが足りないのでしょうか?



スイマセン、記述もれしていました。
J2SDKのincludeディレクトリを指定する必要がありました。

VC++6のメニューから
 [ツール]-[オプション]-[ディレクトリ]-[表示するディレクトリ:インクルード ファイル]
 で、インクルードパスを指定することができますので、次のようにパスを指定してください。
  「c:¥j2sdk1.4.1_01¥include」
  「c:¥j2sdk1.4.1_01¥include¥win32」


#独り言ですが、この掲示板って円マーク”¥”を使うとおかしくなりますね。
 全角の¥マークで代用してます。
ヒロピン
常連さん
会議室デビュー日: 2003/12/14
投稿数: 35
投稿日時: 2005-12-07 16:13
Tdnr_Symさん、教えてください。

インクルードパスをしたら先ほどのエラーは出なくなりましたが、
今度は下記のようなエラーが発生しました・・・。

只今調査中ですが、すぐに原因が分かるようでしたら
ご指摘お願いします。

--------------------構成: VbComWrapper - Win32 Debug--------------------
コンパイル中...
VbComWrapper.cpp
D:\JNI\VbComWrapper.cpp(11) : error C2871: 'VbCom' : 存在しないか名前空間ではありません。
D:\JNI\VbComWrapper.cpp(43) : error C2065: '_OtherSystem' : 定義されていない識別子です。
D:\JNI\VbComWrapper.cpp(43) : error C2065: 'pOtherSystem' : 定義されていない識別子です。
D:\JNI\VbComWrapper.cpp(43) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
D:\JNI\VbComWrapper.cpp(44) : error C2065: 'OtherSystem' : 定義されていない識別子です。
D:\JNI\VbComWrapper.cpp(66) : error C2059: 構文エラー : ')'
D:\JNI\VbComWrapper.cpp(71) : error C2227: '->Release' : 左側がクラス、構造体、共用体へのポインタではありません。
D:\JNI\VbComWrapper.cpp(86) : error C2059: 構文エラー : ')'
D:\JNI\VbComWrapper.cpp(91) : error C2227: '->GetData' : 左側がクラス、構造体、共用体へのポインタではありません。
D:\JNI\VbComWrapper.cpp(107) : error C2059: 構文エラー : ')'
D:\JNI\VbComWrapper.cpp(113) : error C2227: '->SendData' : 左側がクラス、構造体、共用体へのポインタではありません。
cl.exe の実行エラー

VbComWrapper.exe - エラー 11、警告 0
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-12-07 16:39
こんにちは。

引用:

ヒロピンさんの書き込み (2005-12-07 16:13) より:

インクルードパスをしたら先ほどのエラーは出なくなりましたが、
今度は下記のようなエラーが発生しました・・・。



エラー内容からすると
#import "VbCom.dll"
のVbCom.dllが見つからないわけではなさそうですね。

ビルドで出力されたファイルの中に(DebugフォルダかReleaseフォルダ内です)
".tlhファイル"と".tliファイル"がありませんか?
なければ、次の1行以外をコメントアウトして、ビルドしてみてください。
.tlh/.tliが生成されるはずです。

VbCom.tlhファイルの内容
コード:
#import "VbCom.dll"			// VB6のDLL



VbCom.tlhがあれば、その中をエディタでのぞいてみてください。
だいたい次のようなコードではありませんか?
細かいところは違うはすですが…

コード:
#pragma once
#pragma pack(push, 8)

#include <comdef.h>

namespace VbCom {

//
// Forward references and typedefs
//

struct __declspec(uuid("a7aefadd-eb32-46d3-9261-54e304c3de5c"))
/* dual interface */ _OtherSystem;
struct /* coclass */ OtherSystem;

//
// Smart pointer typedef declarations
//

_COM_SMARTPTR_TYPEDEF(_OtherSystem, __uuidof(_OtherSystem));

//
// Type library items
//

struct __declspec(uuid("a7aefadd-eb32-46d3-9261-54e304c3de5c"))
_OtherSystem : IDispatch
{
    //
    // Wrapper methods for error-handling
    //

    _bstr_t GetData ( );
    HRESULT SendData (
        BSTR * data );

    //
    // Raw methods provided by interface
    //

    virtual HRESULT __stdcall raw_GetData (
        BSTR * _arg1 ) = 0;
    virtual HRESULT __stdcall raw_SendData (
        BSTR * data ) = 0;
};

struct __declspec(uuid("bd83fced-8c0b-4d74-b755-b7091c46e55c"))
OtherSystem;
    // [ default ] interface _OtherSystem

} // namespace VbCom
#pragma pack(pop)



解決しないようであれば、".tlhファイル"の内容を
書き込んでいただけると助かります。

あと、気になったのですが
引用:

VbComWrapper.exe - エラー 11、警告 0



「Win32 Application(.exe)」として、プロジェクトを新規作成しませんでしたか?
「Win32 Dynamic-Link Library(.dll)」としてプロジェクトを新規作成するようにしてください。
ヒロピン
常連さん
会議室デビュー日: 2003/12/14
投稿数: 35
投稿日時: 2005-12-07 18:36
Tdnr_Symさん、回答ありがとうございます。

先ほどのコンパイルエラーは namespace を間違えていました。
コンパイルは無事通ったのですが、ビルド時に下記のエラーが
発生しました。

何かの紐付きがうまくいっていないような気がするのですが、
原因分かりますか?

--------------------構成: VbComWrapper - Win32 Debug--------------------
リンク中...
ライブラリ Debug/VbComWrapper.lib とオブジェクト Debug/VbComWrapper.exp を作成中
LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/VbComWrapper.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー

VbComWrapper.exe - エラー 2、警告 0
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-12-07 18:44
こんばんは。

引用:

ヒロピンさんの書き込み (2005-12-07 18:36) より:

何かの紐付きがうまくいっていないような気がするのですが、
原因分かりますか?

--------------------構成: VbComWrapper - Win32 Debug--------------------
リンク中...
ライブラリ Debug/VbComWrapper.lib とオブジェクト Debug/VbComWrapper.exp を作成中
LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/VbComWrapper.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー

VbComWrapper.exe - エラー 2、警告 0



えーと、どうも"Win32 Console Application"でプロジェクトを新規作成してしまったようですね。
↓お手数ですけれども、もう一度プロジェクトを作り直してもらえますか?

引用:

Tdnr_Symの書き込み (2005-12-07 16:39) より:
「Win32 Application(.exe)」として、プロジェクトを新規作成しませんでしたか?
「Win32 Dynamic-Link Library(.dll)」としてプロジェクトを新規作成するようにしてください。



#あともう少しだと思いますので、頑張ってください(*^_^*)
ヒロピン
常連さん
会議室デビュー日: 2003/12/14
投稿数: 35
投稿日時: 2005-12-07 19:36
Tdnr_Symさんありがとうございます。

ビルドが通り正常に実行されました!!

ここまで来るのに1日かかってしまいましたが、
今日1日お付き合いしていただいて
本当にありがとうございました。

質問なんですが、DLLがCOMに登録されているかどうかは
何を見れば分かるのでしょうか?

開発サーバ等で実行する場合は、
VbCom.dllをCOMに登録しておいて、
パスの通ったところにVbComWrapper.dllを
置いておくだけで大丈夫ですか?

明日から業務用のプログラムを作成したいと思います。

明日、明後日辺りは色々つまづいてしまうかもしれないので、
もし空いている時間がありましたら、
@IT 会議室を覗いてみてください。

心から感謝しております。

ありがとうございました。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-12-07 19:48
こんばんは。

引用:

ところがjavaを実行したところ・・・
CoCreateInstance failed!!\\ndata:
インスタンスの生成に失敗したようです。



JNIの呼び出しには成功しているみたいですね。
おめでとうございます。

あとはCOMインスタンスの生成が問題ですね。
regsvr32コマンドでVbCom.dllを登録しましたか?
COMが正しく登録できているかどうかは、
VC++6のメニューから
 [ツール]-[OLE/COM オブジェクト ビューア]を起動します。
 "Type Libraries"フォルダの下に
  "VbCom"というアイテムがあれば登録できています。


あと、注意点を1つ。
VB6でVbCom.dllをビルドしなおす場合の手順ですが

1.既存のVbCom.dllの登録を解除しておきます。
   regsvr32 /u VbCom.dll
2.VB6でVbCom.dllを作成します。
3.新たに作成したVbCom.dllを登録しなおします。
   regsvr32 VbCom.dll
4.新たに作成したVbCom.dllをVC++6のプロジェクトフォルダにコピーし
  リビルドを実行しVbComWrapper.dllを作成しなおします。
5.新たに作成したVbComWrapper.dllをjavaのパスの通ったところにコピーします。
6.javaで実行します。


もし、"CoCreateInstance failed!!"という、いつまでもメッセージが続けて
インスタンスの生成に失敗しているようでしたら、
上記の手順を最初から、行ってみてください。

Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-12-07 20:14
こんばんは。

引用:

ヒロピンさんの書き込み (2005-12-07 19:36) より:

Tdnr_Symさんありがとうございます。
ビルドが通り正常に実行されました!!


あれ、うまくビルド・実行できたんですね。
おめでとうございます!
今日1日このことが気になって掲示板に張り付いておりました。

引用:

ヒロピンさんの書き込み (2005-12-07 19:36) より:

質問なんですが、DLLがCOMに登録されているかどうかは
何を見れば分かるのでしょうか?


先の書き込みのとおり「OLE/COM オブジェクト ビューア」というツールを使えば分かります。

引用:

開発サーバ等で実行する場合は、
VbCom.dllをCOMに登録しておいて、
パスの通ったところにVbComWrapper.dllを
置いておくだけで大丈夫ですか?


サーバー側に、すべて
VbCom.dll(Activex dll)、VbComWrapper.dll(JNI)、OtherSystem.class(Javaラッパークラス)
を置くんですよね。大丈夫だと思いますが。

引用:

明日から業務用のプログラムを作成したいと思います。
明日、明後日辺りは色々つまづいてしまうかもしれないので、
もし空いている時間がありましたら、
@IT 会議室を覗いてみてください。



業務用プログラムの作成、頑張ってください。
私もできるだけ、ご相談に応じられるようにしたいと思います。

スキルアップ/キャリアアップ(JOB@IT)