- PR -

JNIで変数を渡したい

1
投稿者投稿内容
NAKA
会議室デビュー日: 2007/02/17
投稿数: 3
投稿日時: 2007-02-17 22:09
お世話になります。

JNIで実装したいことは、ユーザIDを渡して、情報を受取るという事がしたいです。

現在ServretでJNIの実装をURLのサンプルを元に行っており
現在、DLL内でログ出力を確認するところまで出来ました。

更に、パラメータをIN、OUTが1つずつと戻り値のあるものにしたいのですが
Servret からJNIへ渡す事が出来なくて困っております。
ネット上は、JNIソースの main()で変数を渡しているものしか
見つかりませんでした。

技術的には、可能なのでしょうか。
環境は、JDK1.4 + WebLogic + VC6 です。
参考になるサイトやアドバイスをお願いします。
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2007-02-18 02:43
引用:

NAKAさんの書き込み (2007-02-17 22:09) より:
技術的には、可能なのでしょうか。
環境は、JDK1.4 + WebLogic + VC6 です。



WebLogicは分かりませんが、純粋に技術的には可能です。
#でも、VC6はもう古いけど。。。
#JNIも昔からの技術だからそこら辺は変わりませんが。

引用:

Servret からJNIへ渡す事が出来なくて困っております。



サーブレットの場合でJNIを使う場合は別種の問題があります。
要するにDLLがどこにあるべきかという問題です。

それさえ解決しているのなら、次はシグニチャの定義問題が
多いのですが。

あとはWebLogicのサポートに聞くしかないと思いますけど。。

引用:

更に、パラメータをIN、OUTが1つずつと戻り値のあるものにしたいのですが
Servret からJNIへ渡す事が出来なくて困っております。



あの〜、「IN」と「OUT」と何が違うのでしょう。戻り値は戻るんですよね。
Javaにはポインタはないので、OUTはありません。
#と「基本」としては思ってください。
#もちろん技術的にはC的ポインタを管理することは可能です。
#問題はCかJava、どっちが管理すべきかはJNIでは決まりえないことだ。。。

NAKA
会議室デビュー日: 2007/02/17
投稿数: 3
投稿日時: 2007-02-19 11:23
ご回答ありがとうございます。

>>サーブレットの場合でJNIを使う場合は別種の問題があります。
>>要するにDLLがどこにあるべきかという問題です。

呼び出せているので、配置は問題ないという認識です。

>>あの〜、「IN」と「OUT」と何が違うのでしょう。戻り値は戻るんですよね。

Cの感覚で書いてしまいました。
戻り値は、現在調査中です。

>>Javaにはポインタはないので、OUTはありません。

 ということは、DLLで処理した結果は
 C的ポインタを利用しない限り、受取れないという事でしょうか。

あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-02-19 11:45
引用:

NAKAさんの書き込み (2007-02-19 11:23) より:
Cの感覚で書いてしまいました。
戻り値は、現在調査中です。



Cにも純粋な意味でのOUTパラメータなんてないわけですが・・・。
すみません。下らないツッコミですね。
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2007-02-19 12:01
単にポインタをハンドラのように使いたいだけなら

private static final native boolean CryptAcquireContext(int[] phProv, String pszContainer, String pszProvider, int dwProvType, int dwFlags);

のようにすればphProv[0]にハンドラが返されますよ。
NAKA
会議室デビュー日: 2007/02/17
投稿数: 3
投稿日時: 2007-02-20 22:23
戻り値を返せるようになりましたので
実装できました。

文字コードの変換には少し手間取りましたが・・・

ありがとうございました。
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2007-02-27 20:00
すでに解決済みなので、単なる補足ですが。

1) Cソース側は
#define UNICODE
しておくとpEnv->GetStringChars,pEnv->ReleaseStringChars
でそのまま文字列が使えますよ。

2) http://community.java.net/projects/community/jdk
にjnaというライブラリがあって、簡単なAPIならCソースを
作らずにそのまま呼べますよ。
(私はCソースを自動生成してますが。)

これは情報というより前に少し悩んだまま、忘れてしまっていた
ことですが、/clrをつけて作成したDLLをjnaで呼び出そうとしたら
失敗してしまいました。たぶんjava.exeが/clrつけてないのだと
思っています。



1

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