- PR -

JNI経由のプリンタ情報検出

投稿者投稿内容
オアシス
会議室デビュー日: 2004/05/17
投稿数: 9
お住まい・勤務地: nagoya
投稿日時: 2004-08-25 09:33
C言語の関数からJNIを経由してJavaのjava.awt.print.PrinterJobにある
lookupPrintServices() 、getPrintService() を使用すると
メソッドがプリンタ情報を検索しにいったまま停止状態に
なります(エラー情報も返ってきません)。

<Java側ソース抜粋>
PrinterJob printer = PrinterJob.getPrinterJob() ;

//下記2行はJNI経由で実行できない
PrintService service = printer.getPrintService();
PrintService printername[] = PrinterJob.lookupPrintServices();

<トライしてみたこと>
・JNIを経由せずJavaで直接実行した場合には正常値が返ってきます。
・JNIを使用した場合とそうでない場合でシステムプロパティを比較して
みましたがJVMがServer版,Client版で異なるくらいでした
(ちなみにServer,ClientどちらのJVMでもこの現象は発生しています)

java.awt.print.PrinterJobにあるその他のメソッド(getJobName() 等)は
正常に実行できるのでjava.awt.print.PrinterJob自体が使用できないわけでは
ありません。プリンタの情報はLinuxに登録している情報を検索させにいこう
としています。

同じような現象にあわれた方、意見のあるかたがいらっしゃいましたら
ご教授よろしくお願いします。
parolibre
常連さん
会議室デビュー日: 2002/12/30
投稿数: 33
投稿日時: 2004-08-25 12:42
直接的な回答ではありませんが、、、
AWTということなので、フレームバッファの設定は大丈夫ですか?
オアシス
会議室デビュー日: 2004/05/17
投稿数: 9
お住まい・勤務地: nagoya
投稿日時: 2004-08-25 13:20
parolibreさん回答ありがとうございます。

フレームバッファの設定は特に意識した作りをしていませんが、
Javaのみの環境(JNIを使用していない場合)には正常に動作しているので
大丈夫ではないかと考えています。

メソッドが停止しているときの状態をnetstatで解析してみると、
ポート番号:515のスプールが通信を行っていないように見えました。
JNI経由でプリンタ関係のメソッドを使用するときには何か特別な設定が
必要なのでしょうか?
parolibre
常連さん
会議室デビュー日: 2002/12/30
投稿数: 33
投稿日時: 2004-08-26 09:52
引用:

フレームバッファの設定は特に意識した作りをしていませんが、
Javaのみの環境(JNIを使用していない場合)には正常に動作しているので
大丈夫ではないかと考えています。



う〜ん、、、
「どういう環境で動作させている」というのがすっぽり抜け落ちているので把握しきれないのですが、
Java版はどういう環境で動作させているのでしょう?
JNI版はどういう環境で動作させているのでしょう?

引用:

ポート番号:515のスプールが通信を行っていないように見えました。


「コネクションは張っているけれど…」ということでしょうか?
オアシス
会議室デビュー日: 2004/05/17
投稿数: 9
お住まい・勤務地: nagoya
投稿日時: 2004-08-26 10:31
返信ありがとうございます。
引用:

Java版はどういう環境で動作させているのでしょう?
JNI版はどういう環境で動作させているのでしょう?


動作環境は下記になっています。
Java:j2sdk1.4.1_03
OS:RedHat ES2.1
Java版はJavaでmainを作成しlookupPrintServices() 、getPrintService() を
使用させているメソッドを動作させています。
JNI版はCでmainを作成しJNI経由でJavaのメソッドをコールしています。

引用:

「コネクションは張っているけれど…」ということでしょうか?


いえ、lookupPrintServices() を動作してもコネクションすら張られていません。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-08-26 10:47
unibon です。こんにちわ。

引用:

オアシスさんの書き込み (2004-08-26 10:31) より:
Java版はJavaでmainを作成しlookupPrintServices() 、getPrintService() を
使用させているメソッドを動作させています。
JNI版はCでmainを作成しJNI経由でJavaのメソッドをコールしています。


C から Java VM を呼んでいるわけですよね。なんのために(そんな面倒な)、という疑問もわずかにあるのですが、もしかしたら、手軽な API がネイティブにはないけど、Java にたまたまあったので使おうとされているのでしょうか。
良くは分かりませんが、プロセスの owner が違うとかそういうアカウント絡みのことはないでしょうか。あるいは、なにかライブラリファイル(so っぽいもの)のロードがうまく行かないのかもしれません。
デバッガ上で動かして、止まっている個所を突き止めるということもできなくはないとは思いますが、大変ですよね。
parolibre
常連さん
会議室デビュー日: 2002/12/30
投稿数: 33
投稿日時: 2004-08-26 11:25
引用:

動作環境は下記になっています。
Java:j2sdk1.4.1_03
OS:RedHat ES2.1
Java版はJavaでmainを作成しlookupPrintServices() 、getPrintService() を
使用させているメソッドを動作させています。
JNI版はCでmainを作成しJNI経由でJavaのメソッドをコールしています。


javaコマンド&javaプログラムは、どこで実行しているのですか?
Xなどの上ですか?
それとも、Xが動いていないコンソール/ターミナルの上ですか?

後者ならば、Xvfbとかがないと動かないのでは?
ただ、使用しているJ2SDKが1.4.xなので、headlessオプション指定は正しく行っていますか?

引用:

いえ、lookupPrintServices() を動作してもコネクションすら張られていません。


「呼び出しても、動作していない」という訳ですね。
呼び出して戻ってこないので、Exceptionも捉えられていない…と言う感じなのでしょうか?
オアシス
会議室デビュー日: 2004/05/17
投稿数: 9
お住まい・勤務地: nagoya
投稿日時: 2004-08-26 13:09
XでもXが動いていないところでも同様の動きをしています。
システムプロパティにjava.awt.headless=trueを設定しています。

呼び出したきり応答がなくExceptionもとれない状況です。

プロセスはuser指定の時も、rootの時も特に変化がないです。

何を調べたら良いかもつかめていないところが辛いところです・・・。

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