★お前らJavaはJNIで組もうぜ★

このエントリーをはてなブックマークに追加
1chinkasu
このすれ立てても一人としてレスはいるとはおもっちゃ
ねーけどさ
2ちゃんのアフォにはこのレス荒らすことぐらいしかできないと
思ってるぜ
お前らに期待を裏切るような書き込みをリクエストする
チンカスの仕切るスレなんか育てたくない。
育ててくれなくて結構よ

Java Native Interface プログラミング
ピアソン
ちょっと誤植あるけどね
JNIの資料ってあまりないからage

まあポイントはJava側のクラスメンバと
C/C++ネイティブで取り扱う引数とのせめぎあいかな
SWTを参考にすべし
1に2ちゃんのアフォを黙らせるような書き込みをリクエストする
C#並に簡単に書けるようになりませんか?
はっきりいってウザイです
>>8
お前みたいな能無しの書き込みをまってたんだよ
どんどん書いてくれ
俺はヴァカだからC#しかできねぇってな
C++からJVMコールしてますがなにか
>>1
お前がなにか逝ってみろ
121ですが:02/10/06 10:15
JavaからC/C++のバイナリをロードするにはJNIを知らないとできません
C/C++技術者がJNIを知るとJVMの起動から呼び出しまで自由自在

2ちゃんの方々は言語をやっているだけでperlがうざいだのアセンブラがえらいだの
入り口の部分でのみ優劣を競っている低脳君がほとんどです
大切なのは言語でなにがどこまで深く実現できるかを知ることです
>>12
> 大切なのは言語でなにがどこまで深く実現できるかを知ることです

「だったら、アセンブラがえらいよ。」と言う突込みしかこないぞ。

お前には、簡単にかつ安全に実現できる (=納期迅速、激安) と言う視点はないのか ?
141ですが:02/10/06 20:21
>>12
アセンブラじゃ速くてもコストがあわないぜ
速さとメンテナンス性のバランスを考えた上でのJNIなんだけどな
アセンブラ偉いよ昔のCMOSさんみたいにVzエディタを全部アセンブラで
くむぐらいならな
表面でアセンブラ云々抜かすなよ
おまえもCMOSさんぐらいに組めるのなら尊敬するけどな
>>14
> アセンブラじゃ速くてもコストがあわないぜ
> 速さとメンテナンス性のバランスを考えた上でのJNIなんだけどな

こいつなんか勘違いしてねーか ?
15のような言うだけでアセンブラもCもできない厨房は放置ということで
そろそろJNIにいこうか
漏れはlong型のシグネチュアがLでは無い仕様に
結構驚いているけどね
>>17
Lはクラスの完全修飾ってアレか
1915:02/10/07 22:27
>>16
> そろそろJNIにいこうか

ププッ、みんなついてこなくって寂しいねぇ。
まあ、アセンブラと JNI を比較してぐだぐた言ってる厨房の相手はしてられねーよな。
Windows + Java でクライアントアプリケーション開発してるけど、
JNI経由でWin32APIを適当に利用すると便利だね。
javaではスクリーンサイズしか取得できないけど、
JNI使えばタスクバーを除いたスクリーンのサイズを取得できるとか。
ファイルチューザーなんぞもWindowsの呼び出す方が楽だし。

みんなは、JNIでどんなことしてる?
>>20
Javaはmainだけで、残り全部nativeにやらせてる。
Javaのすごさを証明するのに便利(w
>>20
SystemParametersInfoのこと?
おいらはSWTの
OS#SystemParametersInfo(int uiAction, int uiParam, RECT pvParam, int fWinIni)
で取得するけどね。
23chinkasu:02/10/08 22:06
おお!
ちょいとこない隙に
>>19〜22
ようこそ!
おいらもC/C++で作った過去の資産を
JNIでがんがん使ってるよ
なんたって
Write ... なんたらは糞くらえ
速くて再利用可能なJNI最高だぜぃ
24デフォルトの名無しさん:02/10/08 22:39
JNIって本当にあるのでしょうか?
探しているのですが見つかりません。
もしかしてこれはネタスレでしょうか?
javac -h でJNI用のヘッダが生成されるYO!
26デフォルトの名無しさん:02/10/08 23:20
>Windows + Java でクライアントアプリケーション開発してるけど、
>JNI経由でWin32APIを適当に利用すると便利だね。
うちの会社ではwindows上のクライアントアプリを作るために、
GUIとかAPIをJNIでラップしてるやつ買ったよ。
便利だね。
C#のライブラリーはなんであんなに糞なの?
>>26
> GUIとかAPIをJNIでラップしてるやつ買ったよ。

Javaって write once run anywhere がウリなのにそんなことしたら
意味ネーじゃん。馬鹿?
>>26
へぇ〜。何ていうやつ使ってるの?
>Javaって write once run anywhere がウリなのに

おいおい…。
いまや特定OSのAPIにも使われてるのに…。
>>24
JNI最高よ
27みたいなプログラムにパフォーマンスを求めない人は縁はないけどね
で顧客に「おたくの作ったの遅いから作り直せ」とか言われても
「Javaで組む仕様制限です」と逃げるわけね
今時Oracleでさえもネイティブに落としている現実を知らないのね
なによりも今までのC/C++資産をすべて使えるこれ本当
おいおい話していきましょ
>今時Oracleでさえもネイティブに落としている現実
既存部をJAVA向けにラップしてるんじゃなくて、
JAVA実装部をネイティブで書きなおしてるの?(厨でスマン
漏れはデプロイがめんどいEJBの代わりに
JNI経由でCOM+を使うのが利口だと思うが如何か?
>>32
COM+って何ができるのかいまいちわかってないモレに教えてクレ
>>33
COMはコンポーネント技術の総称
MSの仕様策定品目
ようは部品だ、VB用のGUI部品からスタートしているが
分散COMとしてWebのバックグランドサービスや
SQL DB操作用の javaBeanみたいな利用もできる
EJBはOOだ偉いだろうと言うヤシがいるかもしれんが
パフォーマンスはEJBの敵じゃないし STLで組めばCOMの内部はOOで実装可能
デプロイは簡単でGUIDと言う一意のクラスIDをレジストリに登録する
COMは仕様であり、汎用機、UNIXでも動作する
また、開発する言語はなんでもよい
OLE, ActiveX, COM, COM+, DCOMなどMSが節操の無い名称を付けたため
基本仕様の素晴らしさをスポイルしている嫌いがある
> COMは仕様であり、汎用機、UNIXでも動作する
MSが仕様を公開しないから、
EJBやCORBAから接続できないって話を聞いたが?

>基本仕様の素晴らしさ
CORBAより、どの辺がすばらしいの?
煽りじゃなくて、普通に知らんのです.
>>34
分散オブジェクトサービスみたいなんもんでしょーか。
あれ?そうするとDCOMとの違いが分からん...
3720:02/10/09 01:02
>>26
へー、売り物でそんなラッパーがあるですか?
良かったら製品名とか教えてもらえませんか?

>>27
write once run anywhere なんて言ってる人がまだいたんだ…
今、javaに魅力を感じてる開発者って「どこでも動く」ということより
言語仕様、充実してきたクラスライブラリに惹かれてるのではないかと。
>>37
ああ?Java厨召還するぞコラァ
良スレage

>>27
SWTじゃなくて?
40デフォルトの名無しさん:02/10/09 01:09
って、ageてねーよ、俺(鬱
41デフォルトの名無しさん:02/10/09 01:11
JNI使うと遅くなるんだよ
知らないの?
42デフォルトの名無しさん:02/10/09 01:19
JNI通すところ自体はね。
>>41
詳細キボンヌ
>>41
確かにね
Cのコードをラップして利用するわけだから当然だよね
呼び出したあとのビジネスロジックなどがJVMの動作より
トータルで速ければいいわけですよね
あと、A/D変換のソフトウェアなんてJavaからコールして作成できるし
アイデア次第でJavaの世界も広がるわけですよね
>>37
>>言語仕様、充実してきたクラスライブラリに惹かれてるのではないかと。
そのとおりだよね
言語仕様は良い!
しかし、かゆいところまでは手が届かない
だからJNIなんだよね

>>38
ここはJNIを応用して幅広い応用技術を含めた情報交換をする場所です
Javaオンリーの狭い了見の人は連れてきても浮いてしまうよ
どうせ実装が美しいとか、他の言語は糞だぐらいしか言えないんでしょうから
どうせつれてくるのならC/C++でCORBAする人とか
EJBのプロを連れてきてね
あっきみに質問だけど
JVMのローカルスタックのデフォルトサイズって知ってる?





>>35
MSはCOM仕様は完全公開しているよ
COMは独占物ではないよ

CORBAとの比較は一言では語り尽くせないのだけど
昔CORBAの立ち上げ時にはAPIレベルでの仕様の統合が行われていないために
実装費用がかかりすぎたとの話があります
COM仕様はその辺枯れている
スレ違いかもしれんがJNIから利用する可能性が高い技術ということで

-----------------------------------------------------------------------------------
サービス COM CORBA
-----------------------------------------------------------------------------------
ライフサイクル IUnknown IF ライフサイクルサービス
恒常記憶域管理 パーシステントストレージ パーシステントサービス
マーシャリング制御 IMarshal IF なし
アウトバウンド制御 IConnectionPoint IF なし
セキュリティ Identification Identification
Authentication Authentication
Integrity Integrity
Confidentiality Confidentiality
ServerActivation
AccessControl AccessControl
Delegation Delegation
Nonrepudiation
トランザクション管理 MS-TransactionServer ObjectTransactionServices
(Viper)
プロパティ管理 MS-ActiveDirectory PropertyServices
4838:02/10/09 09:10
> JVMのローカルスタックのデフォルトサイズ

は、8Mでしょうか・・・
スマンずれてしまた
なにがなんだかわからん糞かいてもうた
>>31
亀レスだが
PL/SQLと同様な機械語コンパイル済みコードをサーバに持っているし
オラクル独自実装のネイティブコンパイルを搭載している
この事実は、オラクルもJVM(所詮インタプリタ)のパフォーマンスを問題視しているという事
の表れと思われる

コマンドラインツール名は ncomp

51デフォルトの名無しさん:02/10/09 12:37
でも、COMをそういう使い方するのは終わりだってね。
.netとかsoapだって、これからは。
OSの中でまだ使われるかもしれないと。

JNIなんて特定のAPIが呼び出したい時くらいしか使わないなぁ。
そんな事もめったにないんだが。
人生に一度あるかないか・・・
>>51
遊びでSOAPToolkitいじったら、
(SOAPの)アプリをCOMにしろとか言われたYO!

まあ、SOAPToolkit自体がRemotingとかへの
つなぎに過ぎなかったのかもしんないけど.
>>51
このスレは使う必要がなくても無理して使いたい人が集うスレにしたかったのです
51もスキルがあるのだから無理して使ってくれる事をキボーン

>53
正直JNIってあんまりいい印象無いのだけど。
以前COMで開発したアプリをJavaから使いたいって言われてJNIを調べてラップしてみようと
したのだけど、結局COMのオブジェクトをJNIのコードで生存管理しなきゃならんかったような
気がしてベラボーに面倒くさくなってやめさせた。
ひょっとしてそれは俺が厨だからか?(笑

ところでrun anywhereってもう化石なの?
ポータビリティとパフォーマンスはトレードオフで考えるのが普通な気がする。
世の中そんなにクリティカルな案件ばっかりなの?
>>54
昔からマルチプラットフォームを謳うソリューションやツールは
必ずパフォーマンスが悪かった事を体験的に知っている俺はrun anywhereで売り出した時から
Javaの事信じてなかったわけだす
さらにservlet黎明期にJDBCを利用して開発したときに原因不明のトラブルとか多発して
また嫌いになったわけだす(最近はずいぶん良くなりましたけど)
そして顧客の要求はシビアでプラットフォーム依存な事をクリアしないと
要求が満たせないことがあってJNIだったわけです

COMについては
COMで実装しているコードをDLLバージョンに落とし込んで(単にコピペ)
利用するといういささかダサい方法もありますよね
 あ〜しかしこれだと工数削減にはならんか、またテストしなきゃならないもんなぁ
JNIとC++の関係は確かに微妙な仕様制限があるようで
追って追跡していきましょう

JNIのポータビリティってそんなに悪くないと思うけどね
ようはプラットフォーム依存のところをうまく#ifdefしていけばよいし
コールするFunction/Methodを切り替えられるよう作成すれば良いのだし
まあこれらを実現するには
多数プラットフォームでコンパイルビルドできてプラットフォームについて
深く知っている必要があるのだけれども



とりあえずJNIをすらすらと逝くのに必要な
UNICODE->SJIS変換サンプル(Win32)
作者に感謝
http://www.ki.rim.or.jp/~kuro/Java/JNI/JNI-03.html
57デフォルトの名無しさん:02/10/31 01:55
age
一口ポイント

サーブレット

コンパイルして配置したJNI利用のサーブレットの場合

例:Apache+tomcatの場合
Servletコンテナサービスをリロードする必要がある
tomの場合shutdown -> startup

JVMがstaticロードしているからか
一口ちんぽいんと

C関数内でのJNI引数の利用方法
数値型はCの該当型にそのまま代入可能
String型だけやや操作する必要あり




開発環境作成例
JDK1.3とVC++6.0の例
フォルダを作成する
jnihogeroot--------------------vcppprj---------relese
                     +
                     +----debug
VC++のプロジェクトは vcppprjに作成する
  relese, debugはVC++が勝手に作成するフォルダ

jnihogerootに置くファイル
jnihoge.java ..... JNI原始ソース.java
c.bat    ...... コンパイルした後でVCプロジェクトにコピーするバッチ
 ↓
内容
javac %1.java
javah -jni %1
copy %1.h vcppprj

使い方
C:\vcpprj>c jnihoge [Enter]

これでjavahで作成された.hをVC++プロジェクトにコピーしてくれる

VC++のIDEにフォーカスを当てると
「外部のエディタで更新されました・・うんぬん」の表示がでるので
OKを押して、.hの定義を.cppの適当なところにcopy
仮引数をてきとうにセットして関数の中身を書く
VC++をビルドしていっちょうあがり

簡単楽しいJNI
スマンまちがえ
C:\vcpprj>c jnihoge [Enter]
  訂正↓
C:\jnihogeroot>c jnihoge [Enter]

保守
チンカスの仕切るスレなんか育てたくない。
64C++使い:02/11/15 11:57
Java Native Interface?
JNI呼び出しがあるとHotSpot最適化等が阻害されるのかなあ?
>>65
もすこし詳しくお願い
>>66
ごめん。言葉間違えてた、jit化だ。しのう。
>>67
JITね IBM社のテクノロジっすね
JITでネイティブ化されたオブジェクトって
あなたの環境ではどこに置かれるの?
72デフォルトの名無しさん:02/12/11 23:56
hoshu
JINIのスレはここですか?
>>68
JIT って言えば首藤氏の shujit では?
75デフォルトの名無しさん:02/12/26 22:22
jfieldID fid = env->GetFieldID(cls, fname, "I");
でINT型のならフィールドIDをとれるんですが
jfieldID fid = env->GetFieldID(cls, fname, "L");
オブジェクト型のがとれません。
どうすればよろしいか?

76デフォルトの名無しさん:02/12/26 22:32
JNDIって知ってる?
>>76
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/jndi/
コレっすか? でもコレ JNI と関係ないよね。
>>75
ドキュメントによると

>L fully-qualified-class ; 完全指定のクラス

だそうだ。
例えば "Ljava/lang/String;" とかやるみたい、たぶん。
80Java軍曹:02/12/27 04:18
まず普通に一本Javaアプリこしらえて、それをその後、ガッツンガッツンのキッリキリに
JNIに置き換えて...というか全て中身DLLに挿げ替えて、最終的に static void mainと、
そこから連なる一連のメソッドのインタフェースだけをJavaとして残す。
つーか、エントリ以外ほぼ全てnative宣言。
....っていう強姦まがいのコードが書きたい。いや、むしろ一度書いてみたい。

write once , run here only.
81Java軍曹:02/12/27 04:23
ちなみに、当然DLL内ではバージョンの限定されたMFCランタイムや、
何かをインストールしていないと絶対にインストールされないCOMを
ギュゥオンギュゥオンに使用。

write once , run now.
write once, debug anywhere
>>80
>最終的に static void mainと
…。
やりたきゃやれば?
GC とか名前による動的バインディングとかの恩恵を
全部 omit するなら Java でやる必要ないし。
84Java軍曹:02/12/27 05:12
>>83
御意!! まさにおっしゃる通りィッ!!
というより、すでにJavaで無しッッッ!!
>>80
それだったら C言語 のソースをJavaのバイトコードに落とせるコンパイラとか書いた方が面白そう。
86Java軍曹:02/12/27 05:23
>>85
素晴らしいィィッ!! 隊長ッ!!
全ッ然意味の無いシロモノだが、イイッ!

自分、書いてみたいでありますッ! でも仕事量がマジ半端無ェ勢いに
なりそうで、寝小便しそうでありますッ!
ふつうにCやらC++で書いて、それを、main()だけをエクスポートするdllにして、
javaのmainからキックすればええやん。
88Java軍曹:02/12/27 08:20
>>87
(゚听 )ツマンネ
89Java軍曹:02/12/28 01:07
>>88 ← 彼は自分では無いでありますッッ!!
でも、それではつまんないという事には禿げて同意でありますッッ!!
>>87
っつーか Runtime.exec() で(以下略)
素直にネイティブアプリに(以下略)
91デフォルトの名無しさん:02/12/28 01:13
>>90
Runtime.exec()には胴衣ですが、
Javaアプリケーションのプラグインとしてネイティブアプリ
ケーションをコールするっていうのは、あるのかもね。
anywhereでrunしないけどね。
そんなに、まともなソフトつくりたいんならさ、きっぱりJava捨てたら?
>>93
Java捨てて 何使ったら良いでしょうか?
95デフォルトの名無しさん:02/12/28 01:20
>>92
JNIを使うという前提での話にそういう突っ込みしますか…
>>95
JNI使う != run anywhere じゃないような。
Java の標準ライブラリだって JNI 使ってんだし。
97デフォルトの名無しさん:02/12/28 01:28
>>93
チャンポンしろ。
なんでもつかえ。
いいとこどり。
>>94
C#使ったらどうだ?
それでもしJavaと同じように糞だとわかったら、
その頃には次の言語が出てるから、新言語に乗り換えろ。
>>98
それって延々と糞言語使い続けるって選択肢ですか?
100デフォルトの名無しさん:02/12/28 01:31
>>96
どんなボケですか?
ユーザが勝手に作るJNI!=Run Anywhereは常に成立デスヨ。
>>85
CをJavaに変換するなんてとても容易にできることだとは思えないぞ。
ポインタ、アドレス操作も大変だし、
メモリリーク、配列のバッファーオーバーフロー起こすことができるCソースをそのまま
Javaに変換しても動かないし。

Cの構造体をJavaに変換するとフィールドがすべてpublic、だが値型。
構造体への構造体も値型であるから、
それをクラスの中にあるクラス(クラスの集約)として変換しても
どう考えたってそのまんまではエラー。
Javaではクラス(オブジェクト)はすべて参照型と決まっているからね。
変換したいCソースにC++コードいれたらとんでもないことになりそうだね。

ほかにも容易でない理由はまだまだあるんだけど、きりがないからこれくらいにしておこう。

CをJavaに自動変換するなんて現状ではまだ現実的とは思えないな。
JavaをCに変換するのは簡単だけどその逆は容易でない、というか、
不可逆反応です。それだけJavaが整然としたすっきりとした言語ってことだね。

JavaをC#に変換するJUMP to .NET ですら変換がうまくいかないことがあり、
RMI使っているJavaソースや一部のJava独自のライブラリをC#に変換できないというし。

ある程度は自分で書き直した方が早いんじゃないかな。
102デフォルトの名無しさん:02/12/28 01:33
>>101
逆は作ってるヒトたまにいるね。
103デフォルトの名無しさん:02/12/28 01:34
>>101
前橋和哉さんがそういうコンパイラ作る話題をWebに書いてなかったけ?
>>101
C言語ソース -> Javaソース じゃなくて
C言語ソース -> Javaバイトコード だったら出来るんじゃない?

それに C言語ソース -> Javaソース だったら
可変長引数の処理とかも無理っぽいし。
Cをアセンブリやマシン語には出来ても
アセンブリやマシン語をCには出来んでしょ。
Java厨にはそんなこともわからんの?
>>105
つまり、君には理解できなかったと。
>>106 わけわからん
>>105
CをJavaにするコンバータを作るのは無理だけど
JavaでCをエミュレートするのは無理じゃないって事では?
Windowsでレジストリにアクセスしたいときに使ってた。
まあ、せいぜいインストールパスを見るぐらいだけど。
後、イベントログの出力に log4j を使ったんだが、内部
ではJNI経由でDLL呼び出ししてたな。小技的に使うのが
いい感じ。
>>104
可変長引数なら、
可変長引数をあらわすこんなクラスをつくればいいんじゃないか?
import java.util.Vector;

public class VariableLengthArgument {
private int number;
private Vector vector;
public VariableLengthArgument(){
number = 0;;
}

public void add(Object obj){
vector.add(obj);
number++;
}

public Object get(int index){
return vector.elementAt(index);
}

public int getNumber(){
return number;
}
}
>>110
それだったら素直に Vector 使った方が早い。
>>110
Vector#add(Object) 使ってるかと思えば、
Vector#elementAt(int) 使ってる。統一性無いよ。

JDK1.1 との互換性気にするなら
Vector#addElement(Object)
Vector#elementAt(int)

JDK1.1 以前お断りなら
Vector#add(Object)
Vector#get(int)

あと、number 意味なしじゃない?
vector.size() 使えばよさげだし。
つーか、 >>111 の言うとおり クラス作るだけ無駄っぽい。
>>110
おまけに vector が null のまんまだから
add か get で NullPointerException 食らうし。
114Java軍曹:02/12/28 11:30
>>110
>可変長引数をあらわすこんなクラスをつくればいいんじゃないか?

そのクラスをその様にどうしても作りたいなら、むしろ extends Vector !!
ていうか、implements Collection した別ものを用意!!
ただしその場合、内部実装は >>111氏の言うように Vectorとまったく同じッッ!!

というか自分ならむしろ、privateメンバとしてVectorを持たず、普通の配列を
持つであります!そして、java.lang.reflect.Array で newInstanceして
まるでconcatするような処理をワザワザ実装するであります!!

さらにこの場合、内部的にはただの配列なので、
ついでに、 java.util.Comparator を implementsした別クラスを用意し、
何か用がある場合、
java.util.Arrays.binarySearch(..)(スタメソ)の引数として使い、
そのComparator を継いだクラスの中で、渡された「配列の要素」をグリングリンに
いじりまわす処理を書きたいと思いますッッ!!!
(要するにComparatorであって、Comparatorで無し!!実装の上げ足取り!)

要するに”binarySearch”という響きにゾッコン☆LOVEであります!!
115Java軍曹:02/12/28 11:42
>>114 に追記であります!!
ちなみにこの実装は、「こうしたらちょっとは早くなるかも」という
自分の妄想の産物であります!!

Vectorに格納された何らかのオブジェクト、(特に VOID* のつもりの引数)
に対処する時や、union な structのメンバに対処する時に、いちいち Vectorからgetして
getClass() して判定するのがなんとなく遅そうだと思ったのであります!!

故にッッ!!! 突っ込み所満載かもしれないでありますッッ!!!!
>>111-113
コンストラクタで new Vectorしていなかった。
確かにnumberいらないか。

Vectorそのまま使ってもいいけど、
そこに入るのは可変長引数のみであることを意識するために
別にクラス用意した方がいいかなと思った。

あと、 >>114-115 の言うとおり、引数無しvoidにも対応させるための手段も
必要かなと。
 add()メソッドが動くまでget()するとデフォルトでvoid状態
 remove()メソッドで全部消してget()するとvoid状態を返す
な感じに。

http://www.gimlay.org/~javafaq/S012.html#S012-10
を見るとやっぱりクラス作った方がいいかなと。
引数のサイズの上限は255, long, doubleが入った場合は2個分として計算。
これらの振り分け処理をaddメソッドに追加した方がいいかな。

JDK1.1以前お断りでadd,get限定にしますか。
(.Net厨やJ++/J#厨からするとお断りにするなと言いそう)
117デフォルトの名無しさん:02/12/28 17:37
public class Point3d {
    public double x;
    public double y;
    public double z;

    ...

    public void add(Point3d p) {
        this.x += p.x;
        this.y += p.y;
        this.z += p.z;
    }

    ...
}

このaddメソッド程度のものをnativeで書いた場合とどちらが速いんですかね?
そういったことを試したサイトありませんか?
118デフォルトの名無しさん:02/12/28 18:17
昔のJavaコンパイラはCへのコンバータだったんだよね
119デフォルトの名無しさん:02/12/29 12:50
>>117 そこまでコーディングしたなら自分で試せばいいだろ
120Java軍曹:02/12/29 19:25
>>117
>このaddメソッド程度のものをnativeで書いた場合とどちらが速いんですかね?

この「nativeで書いた場合」とは、このスレの主旨から考えるに、当然
「このメソッドについて」、「JNIを使用する」事を想像しているものと思われるが、
その場合、処理速度の早い遅いを決めるポイントは、主に以下の2点になると思われますッッ!!

1)どれだけこのメソッドの中で完結している処理の量がある(多い)か
2)このnative宣言されたメソッドの実体(DLL)が、どれだけJavaのオブジェクトを利用するか

1について、それが「いやーこれがもう本当にループ部分とか壮絶なネストでぐーるぐるなんですよ」
だった場合、早くなるかもしれないと思われます!そして、こことも関わる話でありますが、
2について、「いやー中の処理は殆ど別のオブジェクト(Javaのクラスのインスタンス)のメソッド呼びまくりなんですよ」
だと、かえって遅くなるか、あるいはあんまり変わらない可能性が高いと思われます!!

なぜなら!DLL側で受け取るJavaのクラスのインスタンスは、プリミティブ型(この場合はラッパー)も含めて、
全ていちいちFindClassして探し出さなければならないからであります!

参考↓
ttp://java.sun.com/j2se/1.3/ja/docs/ja/guide/jni/spec/jniTOC.doc.html
121Java軍曹:02/12/29 19:26
簡単に言ってしまえば、「COMを使うっぽい感じ」でありますッッ!!
>>120
それだと今回の add を JNI 化しても遅くなる可能性のが高そうだね。
123Java軍曹:02/12/30 17:41
>>122
御意ッ!
124デフォルトの名無しさん:02/12/31 16:47
>>122
むしろほぼ確実。
最近は、バイトコード実行速度の上昇がめざましいため
JNI呼び出しにかかるオーバヘッドの方が大きくなることが多い
よほど大きなタスクでない限りJavaで完結したほうが速いと思われる。
このスレの趣旨と真っ向から対立する話だけどな。
125Java軍曹:02/12/31 17:25
>>124
正にッッ!!

JNIを「速度を求めて」あるいは「Javaで利用できない機能」を実現する手段として正しく実装したいと思うなら、
変な言い方かもしれませんが、自分が思うに、
「そのJavaアプリケーションのアドイン的な立場として」実装するのが吉ではないかと思われますッッ!!

つまり、「このnativeなヤツは、最初の引数受け取り以降、あるいは最後の戻り値以前の部分が、結構重い
(あるいはプラットフォーム固有の処理ばっかな)んスよ。」で、かつ
「いや、これはここで完結してるんで、JVMに迷惑かけないスよ」である場合に、
初めてその効能が得られるのではないか、と。

そうで無い場合、124氏の言われるように、Javaで完結するのが、本来は吉であると
思われますッッ!!
126C++厨:02/12/31 19:26
nativeインターフェスは速いの〜?(´∀`)
127117:02/12/31 20:03
public void add(Point3d p),public native void add(Point3d p)
の2つで実際にやってみたよ.
方法はこのaddメソッドを100M回呼び,その時間を計測するというもの.
その結果,前者が40msec, nativeの方が大体4000msec.
予想通り呼び出しなんかのオーバーヘッドが大きかったということでしょうか.
ということでもう一つ.今度は↓のようなもの.
public void exe() {
    double x = this.x;
    double y = this.y;
    double z = this.z;
    for (int i = 0; i < 0xfffffff; i++) {
        x += 1.0;
        y += 1.0;
        z += 1.0;
    }
    this.x = x;
    this.y = y;
    this.z = z;
}
単純に0xfffffff回,+1.0するだけのものだけど,
これもまたnativeと2つ作成して,今度は一回だけ呼んで時間を計測したもの.
その結果,普通の場合がおよそ5000msec,nativeは4000msec
あんまり変わらなかったですね.

JDK1.4/WinXP/1GHz/C++コンパイラは.NETのもの(よく分からない)

JNIで処理の速さを求めるのは間違いかもしれません.
よほど負荷のかかる処理でもない限り,JNIは使うべきではないと思いました.
Javaでは実現出来ないところをCなりで実装するためにあるのかも知れません.

ちなみに使用したnativeコードは次の書き込み.
128117:02/12/31 20:10
JNIEXPORT void JNICALL Java_Point3d_add(JNIEnv* env, jobject me, jobject p){
jclass cls = env->GetObjectClass(me);
jfieldID fid_x = env->GetFieldID(cls, "x", "D");
jfieldID fid_y = env->GetFieldID(cls, "y", "D");
jfieldID fid_z = env->GetFieldID(cls, "z", "D");
jdouble this_x = env->GetDoubleField(me, fid_x);
jdouble this_y = env->GetDoubleField(me, fid_y);
jdouble this_z = env->GetDoubleField(me, fid_z);
jdouble p_x = env->GetDoubleField(p, fid_x);
jdouble p_y = env->GetDoubleField(p, fid_y);
jdouble p_z = env->GetDoubleField(p, fid_z);
env->SetDoubleField(me, fid_x, this_x+p_x);
env->SetDoubleField(me, fid_y, this_y+p_y);
env->SetDoubleField(me, fid_z, this_z+p_z);
}

JNIEXPORT void JNICALL Java_Point3d_exe(JNIEnv* env, jobject me){
jclass cls = env->GetObjectClass(me);
jfieldID fid_x = env->GetFieldID(cls, "x", "D");jfieldID fid_y = env->GetFieldID(cls, "y", "D");jfieldID fid_z = env->GetFieldID(cls, "z", "D");
jdouble x = env->GetDoubleField(me, fid_x);jdouble y = env->GetDoubleField(me, fid_y);jdouble z = env->GetDoubleField(me, fid_z);
for (int i = 0; i < 0xfffffff; i++) {
    x += 1.0;
    y += 1.0;
    z += 1.0;
}
env->SetDoubleField(me, fid_x, (jdouble) x);
env->SetDoubleField(me, fid_y, (jdouble) y);
env->SetDoubleField(me, fid_z, (jdouble) z);
}

this.x += p.x;を実装するたけでも↑のようなコードが必要っぽい.
なんか他にいい方法ないですかね?
129117:02/12/31 20:12
>>127の書き込み訂正
× 100M回
○ 1M回
>>127-129
レポートご苦労様っす。
>>128
GetObjectClassとGetMethodIDは一回でいいはず
なんどもやるのは無駄
GetFieldID を init に追い出してチェックしてみたら
100M回の比較で
Point3D.add::4536ms
Point3D.addNative::128084ms
Point3D.addNativeWithGetFieldID::459834ms

ちなみに C++ で Point3D を作ってやってみたら
Point3D->add::2684ms

おまけに Point2D も作ってみたけど
Point2D.add::2814ms
Point2D.addNative::86375ms
Point2D.addNativeWithGetFieldID::415858ms
Point2D->add::2614ms
GetObjectClass/GetFieldIDは案の定重いね
どちらが重かったか分かる?
やってて気づいたんだけど jdk1.4って浮動小数点演算の最適化が甘くなってるかも?
>>132 は jdk1.4.1

jdk1.3.1
Point2D.add::3205ms
Point2D.addNative::87405ms
Point3D.add::3545ms
Point3D.addNative::125200ms

jdk1.2.2
Point2D.add::2964ms
Point2D.addNative::52155ms
Point3D.add::2714ms
Point3D.addNative::73957ms
>>133
ほい。回数は先のと同じく100M回。

invokeJNIMethod::4096ms
getObjectClass::12328ms
getFieldID::74877ms
>>135
グッジョブ!
100M回って、100 * 1000 * 1000 回であってるよね?
>>136
>100M回って、100 * 1000 * 1000 回であってるよね?
そのとーりです。
>>134
浮動小数点演算じゃなくて inline 展開の仕方が悪い(?)のかも
p1.add(p2);
p2.add(p1);

p1.x += p2.x; p1.y += p2.y; p1.z += p2.z;
p2.x += p1.x; p2.y += p1.y; p2.z += p1.z;
で測定したら
Point3D.add::4557ms
自力計算::2694ms
みたいに差が出ました。(jdk1.4.1の場合)
jdkのバージョンによっては あんまし差が無かったりする
(jdk1.2.2だと測定誤差程度だけど自力計算のが遅かったりする)
ので面白いなぁ、と思ってみたり。

特にヘンなのが IBM のjdk1.3.0で
class Point3D extends Point2D にして
public void add( Point3D p ){
 super.add(p);
 this.z += p.z;
}
とかゆーふーにした場合が一番速かったり。

これ以上はHotSpotやらJITやらの知識が無いと測定しても意味無いかも…
ううむ、JIT様がガリガリ最適化したら、
どう書いても同じになりそうな気がするんだが
そうでもないのか。
140IP記録実験:03/01/08 22:23
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/

1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。

27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?

38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。

73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
>>69
アクセスログじゃなくって書き込み単位で記録しているだけだろ
そんな一気にはふえねーだろ
ひろゆきの悲しいときを教えれ。
>>422
別に気にはならないですね。
どうですか。( ´Д⊂
「2chでは裏でIP記録されています。IPを抜かれたくなければ
セキュリティガードに…」

というコピペを流行らせる会 会長↓
さて。2ちゃんの流浪の民を吸収できる掲示板システムを作ることが出来得るなら
これは非常に大きなビジネスチャンスだと思うのだが。
誰かやれ!
>>197

 いや、ま、正論ではあるのだけどな。。

======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 138720人 発行日:2003/1/9

年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。

そんなわけで、年末に予告したIP記録ですが実験を開始しています。

「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
>>493
いくらなんでも、無差別にIP公開はしないと思うが。
>>573
世の中サヨとネットと圧力で出来てると思っているお前のような奴のほうが
世の中にとっては役に立たない
>>196
いや、そんなことはないですよ。
西村氏は
廃人で雪に入って凍っているかと思ったらまだ生きていたんですね。
ちなみに、「国民クイズ」内では日本国憲法が改正され、こんな条文が追加されてる。
日本国憲法第12章104条「国民クイズは国権の最高機関であり、その決定は
国権の最高意思最高法規として、行政、立法、司法、その他あらゆるものに絶対、
無制限に優先する」

笑えるところなのかわからんが34話にはムネオたんか?と思われる方もカメオしてる。
Java Native Interface?
>>481
名誉毀損で逮捕かよ!

でも管理人、笑えないんじゃない?コレ。
>>434
現実のものとなりました。
>>942
一応ありがと。そのリンク先の1の判決文末尾の「別紙発言目録」ってのが
見たいわけなんだけど、そのスレのどっかにリンク張られてるのかな?
・圧縮やなんかでdat落ちした分を省いた
・報告無しで処理された分を省いた
・まとめが好きで好きでたまらないまとめ大好きっ子だった
あーの事ね。



大阪キタ━━━━━━┌(_Д_┌ )┐━━━━━━ !!!!!
お近くの警察署か裁判所へどうぞ>329さん
ニュー速以外はだいたい串通るから
IP記録は無駄無駄。。。
末期症状だな。削除問題をIP記録にすりかえてる。北朝鮮並みの姑息な対応。
ぼうやだからさ
釣りじゃないのなら実に現実味のない意見だ
まあよしゆきも控訴審の判決が出たからにはポーズだけでもとらにゃいかんだろう。
よほど悪質な犯罪予告等を除いてはよしゆきの判断次第。面倒くさくなったら、
当事者同士で問題解決してよん。んじゃ!って感じだろう。
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 139038人 発行日:2003/1/10

なにやら、連日メルマガだしてるひろゆきです。

そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。

重くなって落ちたりしてもご愛嬌ってことで。。。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
大作死ね!とか欠いたら危険になるのかな?
会同


※この書き込みはフィクションです。
 実際の団体・人物・民族等とは一切関係ありません。

このスレのIPとって訴訟するのだけは止めてくれよ。クチビルゲ。
http://aa.2ch.net/test/read.cgi/kao/1039731177/







うわっ何かクラックされて勝手に文章が・・・あ、さらにポインタが書き込みボタンに・・・あわわわ!!
俺もそう思う。高い金自腹で払って掲示板を運営してて
何処の誰かも知らん奴が勝手なこと書いた事によって
自分に火の粉が飛んで来たら、秘密を守ってやる義理は
ないよなひろゆきにしたら。
まぁなんだ

「ひろゆきよ ラウンジが重いんだが・・・と電話しまくって即閉鎖」

が一番早そうだな(藁
復活してちょっとうれしい今日の漏れ
>>IP記録

告発ネタが減少するのは残念。

・WTCテロのリーク
・西部の松坂の駐車違反
・牛肉買い上げの告発

等々、
いろいろとおいしいネタがあったのになあ。
おまえらの知ってる2ちゃん内の告発ネタを教えてください。
良識ある書き込みをしろ
はピン子のAAだったのか(w
国税庁のHP
マスコミって単純だね。
ほんと馬鹿だよな。
正当性を高める必要は全くないな… 知ったかぶりしていた&判決すらちゃんと読んでないな僕は。
まさか弁護士がついてるのに「本件にはプロバイダー責任法が適用され,同法の制定経緯,規制範囲等に照らすと,被告が本件各発言を削除しなかったことにつき削除義務違反はない」と主張するなんて常識的に考えられなかったので…
寝ぼけてたのかな?恥ずかしい(^^; ゴメンナサイ> 231&253
   /⌒ヽ 
  /  ´_ゝ`)   IP子です。よろしこ
  |    /   
  | /| |   
  // | |  
 U  .U
>626
・・・
デンパでしゅか?
いえいえ、誘導どうもありがとうございます。
>>139
JIT様の最適化にも癖があるよーで…
183山崎渉:03/01/13 18:54
(^^)
184山崎渉:03/01/15 18:08
(^^)
>>182
いわゆるJITってクラス境界を越えたinline化はしないのかな?
そうでもしないと限界がすぐに見えちゃう気がするけど。

最近JNIをやってるのですが、JNI Callしたあとって必ず
Exceptionのチェックをしないとダメなんですかね?
かなりウザいんですが・・・

下がりすぎてるようなのでage
186デフォルトの名無しさん:03/01/18 05:08
eclipseでJNIを使ったプロジェクトを開発中ですが、LoadLibrary()で止まってしまいます。
dllはどこに置けばいいのでしょうか。

eclipseスレで聞いたほうがよかったのかな。
確かPATHの通ってるところ
>>185
> Exceptionのチェック
んなわけない
>>186
Windows が使用する DLL 検索パス
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_core_the_search_path_used_by_windows_to_locate_a_dll.asp

他にもレジストリとか見てたよーな気がするんだけど気のせいかも…
>>188
そうなの?FindClassとかGetMethodIDとかは戻り値が0だったら
エラーが起こってるのは判るけど、
CallObjectMethodとかだと戻り値だけじゃわかんないやん。

で、一度exceptionが起こると、続くJNI呼び出しはおかしくなるようです。
つかjava.exeが固まります(jdk1.4.1)。というわけで

env->CallIntMethod();
check();
env->CallObjectMthod();
check();
...

なんていうコードを書くハメになったりするわけですが、激しくダサい。
>>190
ttp://www.ki.rim.or.jp/~kuro/Java/JNI/JNI-05.html
なんかが参考になるかもね
>>190
呼び出しが例外を起こす可能性があるなら、
必ずチェックしなければならない。

188は嘘。騙された190はご愁傷さま。
193186:03/01/18 23:50
もいっちょお願いします。
.dllをJARに入れて配布するには、どうMANIFESTファイルを設定すればいいでしょうか。
>>193
>.dllをJARに入れて配布するには
無理じゃない?
195188,191:03/01/19 22:17
>>192
必死だと思われようがあえて書く。
185は "JNI Callしたあとって必ず" とあるから
"んなわけない" と書いたんですが。
例外を投げる可能性がある場合に
チェックしないといけないのは当たり前。
voidさんいらっしゃい。
197山崎渉:03/01/23 20:11
(^^)
198むー:03/01/24 04:05
>>190
Javaメソッド呼んだ後にExceptionOccurredでチェックして例外発生して
たらC++例外投げるようなJNIEnvのラッパーみたいなの書いて、
nativeメソッド全体をtry-catchで囲んどいてラッパーから投げたC++例外
をキャッチしてJava側にさっくり戻る、みたいなことやったりしたらだめかね?
>>198
結局そうなりますた。
が、windowsでは動きましたがlinuxではJVMがクラッシュしますた。
例外が原因らしいことまでは分かったのですが・・・
>>199
そんなに甘くないのか… なんでだろう?
Linux版のJVMではJava例外の実装にC++の例外機構の何かを使って
バッティングしちゃった、とかそんな理由なんかな。
stack-unwindでJVMのスタックかどっかを破壊しちゃうとか。
core見ないとわかんなそうだけど、JVMのcore読みなんて鬱すぎる…
>>199
try catch なんてハイカラなもの使わずに goto するしか!
>>201
c++のデストラクタを活用してるコードがあるのよ・・・
>>203
赤帽7.2とgcc2.96で、JDK1.4.1な環境だが、試したら大丈夫だたよー
>>204
マジですか?
つかgcc2.96ってどういうバージョンなんでしょう
本家には置いてないし・・・
206204:03/02/02 07:38
>>205
GNUでは2.96は開発版で配布に適さないといってるみたい。
ttp://gcc.gnu.org/gcc-2.96.html
でも、RedHat社のサイトにはRPMがまだあるみたいだね。
2.95や3.xと互換性はないらしいが。。。
2.95.2とか、3.2とかじゃうまくいかないのかな。
204の環境は借り物だったんで、他はわからんですわい。スマソ
JNI通すところ自体はね。
208デフォルトの名無しさん:03/02/20 17:14
なんでわざわざC++でつくられたバイナリをJAVAから使う必要があるのだ?
perlにしといたら?
>>208
なんでわざわざC++でつくられたバイナリをperlから使う必要があるのだ?
>>208
Javaでコーディングする部分のOSへの依存を下げるため
この間初めて JNI 使って Windows の CPU 使用率をとってみた。
結構簡単だった。
>>211
SNMP使えば、Windows でも Linux でも同じコードで CPU使用率とれるのに。。
213デフォルトの名無しさん:03/03/07 21:59

http://page5.auctions.yahoo.co.jp/jp/auction/e22909695

ヤフオク出品したよ
1円スタートでマジお勧め!

「10日でおぼえるJSP/サーブレット入門教室」翔泳社

あげ荒らし氏ね
215電波さん:03/03/16 03:16
現在VMに興味があって最近勉強しだしたところ。
このスレ結構面白いです。

JNIなんて「共有オブジェクト読んで関数呼べば良いんだろ」程度に思ってたけど
結構やること多いのね。nativeコードからのJavaVMの呼び出しなんて念頭になくって
これから調べないといけないです。
勉強になります。
216デフォルトの名無しさん:03/03/22 08:12
勃起age
いろいろ書籍やWEBサイトを参考にしてるんだが
どうやってもCからJVMをロードできない。
何か根本的に間違えてるのだろうか。
218デフォルトの名無しさん:03/03/22 17:08
>なんでわざわざC++でつくられたバイナリをJAVAから使う必要があるのだ?

あなたTYPE2のJDBCドライバを使ったこと、ありませんか?
Pure じゃなくても、少しくらい汚れてしまった Java の方が萌える

>>212
SNMP って ICMP じゃなかったっけ?
>>219
> SNMP って ICMP じゃなかったっけ?

ハァ ? プロトコルの勉強しなおした方がいいんじゃない ?
http://www.arkweb.co.jp/~yukio/pro_ichiran.xls
221山崎渉:03/04/17 15:51
(^^)
222デフォルトの名無しさん:03/04/19 13:47
結論:全部C++で。これ最強。
223山崎渉:03/04/20 03:39
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
JavaでHello World JNI編
ttp://www.hellohiro.com/native.htm
225山崎渉:03/05/28 13:13
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
swig使ってJNI部分を自動生成してみたんだけど結構便利そう
http://swig-jp.dyndns.org/
いえいえ、誘導どうもありがとうございます。
   /⌒ヽ 
  /  ´_ゝ`)   IP子です。よろしこ
  |    /   
  | /| |   
  // | |  
 U  .U

↑ゲーム製作技術板のなんとか君みたい!
ここのマスコットキャラにしよう
229山崎 渉:03/07/15 10:51

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
230山崎 渉:03/07/15 14:02

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
231山崎 渉:03/08/02 02:52
(^^)
232デフォルトの名無しさん:03/08/15 05:24
こんにちは,教えてください。
趣味でUSBデバイスを作ろうとしているのですが,
汎用USBドライバがUUSBD.DLLというものを
通して利用できることがわかりました。

JNIを使えばJAVAからDLLを使うことができるのでしょうか?
JNIの使い方を調べたら,
1.JAVAでソースを書く。
2.コンパイルする。
3.ヘッダファイルを作る。
4.インクルードしてC等でDLLを作成する。
になっていました。

しかし,この場合だと,UUSBD.DLLを
自分で作り変えることになってしまうと考えるのですが,
拾ってきたDLLをそのまま使うことはできますか?
やったことないけど。

Cで作成したDLLからそのUUSBD.DLLをいじればいいのでは?
234デフォルトの名無しさん:03/08/15 14:26
>>232
UUSBD.DLLを使用するプログラムを
JNIにすればいいだけではないのか?
間にかませるって言うことだ
235山崎 渉:03/08/15 15:10
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
236デフォルトの名無しさん:03/08/16 09:32
からあげうまうま
237デフォルトの名無しさん:03/08/17 19:13
俺、cの知識がないからよくわかんないんだよね。
どうやったらいいの?
やっぱcの勉強しないと駄目ですか?
駄目ですよね・・・。
238デフォルトの名無しさん:03/08/17 19:16
>>237
お前はアセンブリで充分だ。
そんな高級な言語使うな
239デフォルトの名無しさん:03/08/17 23:15
JNI本買わないとやっぱ駄目なのかな。
Webで検索したけどほとんど情報無いよ。
このスレ頭から30過ぎくらいまで読んだんだけどさ。









Java次世代コボル決定!
ごめんね10年後のプログラマ達

っていうサブタイトルつけていいですか?
241デフォルトの名無しさん:03/08/18 00:42
>>240
さびれたスレに即レスするのもなんだが、アオるにしても、下手な文章だな。

JNIは、jdk1.5を目前としているいまでは、ほとんど使う必要がないだろう。
GUI周りで、どうしても、使いたいネイティブのAPIがあるときだろうが。
SWTに関していうと、あれはかなり微妙だな。サンがクライアントサイドを本気で取り組めば、存在は消えていく。
逆に、アポーだと、IBMに完全にイニシアチブをとられる流れで、クライアントサイドはSWT一色になる可能性も、
すくないが秘めている。

242デフォルトの名無しさん:03/08/18 01:29
>>241
Javaアプリから、WinのネイティブAPIを叩かなければならないような
仕組みを作る羽目になったときは、つかうど。

「誰だ、この仕組み考えた奴は!」と設計者を呪いながら(ワラ
243240:03/08/18 02:11
>>241
別に煽っても釣ってもないです。
JNIの存在意義と正しい使い方がわかってないのに
JNIとか叫んでる人達(>>1-30くらいで痛いほど見れます)が大杉。

必要性云々ではなくて機種依存性を正しく局所に押さえ込めてますか?
もっというとネイティブAPIをちゃんとラップして使ってますか?
っていうレベルで。>>1-30を見ると正直怪しい。
SWTとかどうでもいいよ。
コンポーネントとして成立してればその部分を移植できれば他でも動くんだからさ。

> JNIは、jdk1.5を目前としているいまでは、ほとんど使う必要がないだろう

何か素晴らしい仕組みが1.5には入るの?
swigならJNIで使うヘッダや関数を定義したファイルを作れば
自動的に定義された関数にアクセスするC言語のJNIソースと
Javaソースを自動生成してくれるのに
Java使いは誰も知らなさそうなのが残念
246デフォルトの名無しさん:03/08/18 17:09
俺はSWINGというより、レジストリアクセスやウィンドウキャプチャとか
アーカイバDLLで圧縮処理とかそう言うレベルの仕事がしたかったんだけど。
Javaで。
無理かな?
Tigar (Java2 SE 1.5) のJava 言語仕様の拡張
http://www.mtl.t.u-tokyo.ac.jp/~nminoru/java/j2se15.html

genericsとautoboxingはうれしいな。for はなんかスクリプトっぽくて気持ち悪い。
aspectjは入らんのな。プロパティの設定は面倒くさいまんまか。
>>248
隼(1.4)から虎(1.5)へ〜JDK1.5について!
http://pc2.2ch.net/test/read.cgi/tech/1056807119/l50

【猿が】JavaニGenericsハ不要 【ソース汚す】
http://pc2.2ch.net/test/read.cgi/tech/1055519583/l50

あたりでやってくれ。
250246:03/08/19 13:07
>>247
ちょっと逝ってくる。





ただいま。
おかえり
252デフォルトの名無しさん:03/08/20 16:16
age
sage
254デフォルトの名無しさん:03/09/25 20:58
それでもおまいらはJNIをおいそれと使いますか?
java から c を呼び出すのでなく
c から java を呼び出すのに最近はまってる。

ライブラリが充実してて非常によい。
普通に c/c++ のライブラリ使えという話もあるが。
256デフォルトの名無しさん:03/09/28 06:32
>>255
むしろ普通にJavaを使え。
JNIでスタートアップルーチンだけ用意して。
>>1
レスを荒らす方法を教えてください。。。
C言語からJavaを呼び出すのってバージョン依存激しそうに見えるんだけどそうでもない?
>>258
Java のバージョンとは別に JNI にもバージョンがあって
JNI 1.1 と 1.2 ではだいぶ書き方が違うけど
Java 1.2 から 1.4 まで全部 JNI 1.2 だったと思うから
バージョン依存の問題はあんまりたいしたことない。
260デフォルトの名無しさん:03/10/13 17:03
JAVAでCDプレーヤーを作るコツを教えて下さい。難しいでしょうか?
261デフォルトの名無しさん:03/10/14 23:07
gcj + swtでwindows用の
アプリケーションを作ろうと思っています。
waveやmidiを鳴らしたいのですが、
gcjでは実装されていません。
jniを用いたクラスライブラリは存在しないでしょうか?
よろしくお願いします。
win32apiのJNI用ラッパか・・・
MSが自社用JavaVM専用に作ろうとしてSunとケンカして以来、
大きなものは誰も作ってないと思う
263261:03/10/17 21:03
>262
レスありがとうございます。
自分の必要な分はwin32APIを
勉強して、なんとかできました。
swigつかって自分でSDLのラッパー作ってみればどうよ
javahでヘッダが出来るじゃないですか。んで
java_パッケージ名_クラス名_関数名(ネイティブメソッド)
ってなりますけど、既存の関数呼ぶにはやっぱりこの長い名前の関数から
呼ぶしかないですかね。教えてください。
>>265
swig使ったら自動的に生成してくれますよ
267265:03/10/28 22:54
自動で生成って。。。
既存の関数名では出来ないですかね?
調べてみます。
できないからswig使えってことじゃないの?
269デフォルトの名無しさん:03/11/06 14:32
JAVAでC呼び出すなら最初からCで記述すればよくないですか?
何かメリットでもあるんでしょうか?
>>269
最終的に機械語にするんなら、なんで最初から機械語で書かないで C言語を使うのか?
ってのと同レベルの疑問だね。
JavaでCを使うのは既存のC言語ライブラリが長年使われているもので
実績があるもので、それを何とか再利用したいときなどにメリットがある。

けれどもJNIはJavaにとって苦肉の策。

基本はJavaで、というのが美しい。
272デフォルトの名無しさん:03/11/06 15:12
>>271
おまえ、プログラマ?
デベロッパ用のソフトなんてJNIが絡んでるの多いぞ
そういうの作らないとわかんないとは思うけど
BASICから機械語呼び出すのとおんなじ
あああ懐かしい
274デフォルトの名無しさん:03/11/07 11:34
JAVAからCを呼び出してPRINTFを使って文字を出力する単純な処理ができません。
ライブラリを作ってパスを通してもライブラリが見つからないというようなメッセージが出てしまいます。
どのようにすればいいのでしょうか?
>247
随分難易度の高いことしてんなー
わかったら本でも書け
276デフォルトの名無しさん:03/11/07 22:13
CにSTRINGの文字列を引数として読み込む時に何で構造体を使わなくてはいけないのですか?
>>276
STRING って何? STRING は (String(Java) == jstring(JNI)) と同等?

jstring だと構造体っても struct _jobject; (もしくは class _jobject{};)だし…
278デフォルトの名無しさん:03/11/08 00:37
Cで作成した関数をjavaから呼び出したい場合、
JNIEXPORT〜の形にすると思うんですが、
プロトタイプ宣言の部分はJNIには不要ですよね?
消してしまって問題ないですか?
>>278
構造体の話は何処行ったんだ?

> 消してしまって問題ないですか?
それは javah が自動生成したコードを削って良いかって話ですか?

javah が生成したファイルの先頭に
> /* DO NOT EDIT THIS FILE - it is machine generated */
って書いてあると思うんだが…
       , --- 、_
      /ミミミヾヾヽ、_
   ∠ヾヾヾヾヾヾjj┴彡ニヽ
  / , -ー‐'"´´´    ヾ.三ヽ
  ,' /            ヾ三ヽ
  j |             / }ミ i
  | |              / /ミ  !
  } | r、          l ゙iミ __」   
  |]ムヽ、_    __∠二、__,ィ|/ ィ }
  |    ̄`ミl==r'´     / |lぅ lj  >>1 諦めろ
  「!ヽ、_____j ヽ、_  -'  レ'r'/
   `!     j  ヽ        j_ノ
   ',    ヽァ_ '┘     ,i
    ヽ  ___'...__   i   ハ__
     ヽ ゙二二 `  ,' // 八
      ヽ        /'´   / ヽ
      |ヽ、__, '´ /   /   \
281278:03/11/08 09:23
C単体で動くプログラムはできていて、そのプログラム内で使われている関数をJAVAから呼び出したいと思っています。
C単体で実行はしないのでCのソースのプロトタイプ宣言の部分は削っても問題ないですか?
という質問です。
>>281
> C単体で実行はしないのでCのソースのプロトタイプ宣言の部分は削っても問題ないですか?
オマエの手元にしかないソースに判断求められてもねぇ…

基本的に削ると何かメリットがあるのか良く考えてみた方が良いような。
>>281
構造体の話はどこいったんだ?
284デフォルトの名無しさん:03/11/08 18:36
Cで適当に作った関数はプロトタイプ宣言をしなくてもJNIで呼び出せたので、別にプロトタイプ宣言なんてしなくてもいいじゃんと思いこんでいるのですが、そんな問題では無いのでしょうか?
おまいらのやっている事VBと同じやん。
>>284
構造体の話はどこいったんだ?

> Cで適当に作った関数はプロトタイプ宣言をしなくてもJNIで呼び出せたので、別にプロトタイプ宣言なんてしなくてもいいじゃんと思いこんでいるのですが、そんな問題では無いのでしょうか?

とりあえず、JNI に関する質問ではないので C の初心者スレにでも言って聞け。
JNIを扱うには、CとJavaとOSに精通してないと厳しいぞ。
>>287
おまいの言っている事VBと同じやん。
>>287
CとJavaとOS について初心者よりマシっつー程度の知識があれば JNI 使えます。
290デフォルトの名無しさん:03/11/09 12:59
でもJNIの初心者向けのサイト行っても引数としてオブジェクト使ったり構造体のポインタをオブジェクトに対して使ったり、もう暗号みたいになっててよくわからんですよ。
優しく解説されている本とかあるんでしょうかね?
>>290
> でもJNIの初心者向けのサイト行っても引数としてオブジェクト使ったり構造体のポインタをオブジェクトに対して使ったり、もう暗号みたいになっててよくわからんですよ。
それは精進が足りん、ってだけの話では?

とりあえず、キミが JNI は良くわからない、と思っている事だけはわかった。
何がわからないのかはサッパリわからない。
JNIとは関係なくプロトタイプ宣言はしておいたほうがいいよ。
コンパイラが型チェックしてくれてコーディングミスを指摘してくれる。
SwigつかってJavaからSDLを使うラッパー作ったけど公開してほしい人っている?
>>293
公開したいんだろ? 公開したらいいじゃん。
まったく、いやらしい言い方する奴だな。
>>294
うぅ・・・気をつけます、どうやら誰も要らないみたいなんでひっそり封印します
296デフォルトの名無しさん:03/11/14 13:59
日本語の文字列の受け渡しがさっぱり分からないのですがサンプルに書いてある通りに書いてみて、
こういうもんだと割り切って詳しく理解する必要はありませんか?
>>293
誰かが JSDL ってのを公開してたような…
>>296
> こういうもんだと割り切って詳しく理解する必要はありませんか?
その程度の情報で同意を求められても…

文字列は UTF 使うってのを忘れてる、とかじゃなくて?
299デフォルトの名無しさん:03/11/19 14:39
Cで作った文字配列をJAVAに返すやり方がいまいちわかりません。
簡単な方法はありませんか?
>>299
C の char配列を Java の byte配列に変換して渡してやるか、(渡された先で String に変換する)
JNI 経由で java.lang.String のコンストラクタ String(byte[] bytes,String encoding) を呼び出せ。
301デフォルトの名無しさん:03/11/19 16:29
C側のネイティブ関数の戻り値はJSTRINGじゃないですよね?
UTFって使わなくていいんでしたっけ?
>>301
それは JNI とは関係ない話だ。自分で調べろ。
UTF8になってるならサポート関数があったと思う
>>303
それは >>296 のサンプルに書いてあると思われ。
すみませんでした。
知ったかぶりしてますた。
306デフォルトの名無しさん:03/11/20 19:19
SPRINTFで取得した文字列をNEW OBJECT ARRAYを用いて作った配列に格納したいのですがJAVAプログラムの実行時にエラーが出てしまいます。
何かよい方法はないでしょうか?
>>306
> SPRINTFで取得した文字列をNEW OBJECT ARRAYを用いて作った配列に格納したいのですが
C での文字列と Java での文字列は別物として考えたら?
あと、大文字小文字は正確に書け。

> 何かよい方法はないでしょうか?
JNI に手を出す前に C か Java をちゃんと勉強する事をお勧めする。
308デフォルトの名無しさん:03/11/20 19:48
もちろん別の配列として扱っています。
ようはCの配列の中身をJava側の配列に入れたいのですが、
New jObjectで作った配列には文字変数の指定しかできないため、文字配列を指定して入れる事が難しいのです。
他の方法はありませんか?
>>308
「New jObject」って何よ。
>306
ようするにキャラクタ配列をオブジェクト配列に入れたいということ?
型が違うから、char型をCharacterオブジェクト型にしないといけないと思うけど。

JNI使うと、エラー発生時に"このエラーをSUNに報告してくれみたいな"のが出たりして
大変だと思うけど地道に頑張ってください。
ここもネタ心者が出没するよーになったか。

文字列の受け渡しで二週間もハマる馬鹿が実在するとも思えんしなぁ…
>>308
構造体はどーなりましたか?
314ネタ心者:03/11/21 09:25
すみませんでした。
知ったかぶりしてますた。
315310:03/11/21 09:30
>311
真面目に困ってるかと思っちまいました。
316デフォルトの名無しさん:03/11/24 13:15
JNI_OnUnloadって本当に使える?
デバッグ出力してみたけど、通ってるように見えない。
317デフォルトの名無しさん:03/11/24 18:48
int data[512*384];
jintArray jdata = env->NewIntArray(512*384);
env->SetIntArrayRegion(jdata,0,512*384,data);
によってできた配列jdataのメモリを明示的に開放する必要はありますか?
318デフォルトの名無しさん:03/11/24 19:04
>>317につけたし。
最後に
return jdata;
します。
解放ってどうやってやるつもりだ?freeか?
320デフォルトの名無しさん:03/12/20 04:24
c++でウィンドウを作り,Javaから呼び出しています。
メインのウィンドウは出ますが、ダイアログが出ません。
同じソースファイルをcから呼ぶとダイアログも表示されます。
だれか教えてください。
>>320
環境が分からん。Win32か?
322デフォルトの名無しさん:03/12/20 16:14
320です。
すみません。win32です。VC++6でdllをつくりました。
どうやらリソースエディタで作った、メニューやダイアログが
うまく読み込めてないみたいです。
どなたかアドバイスお願いします。
>>322
具体的に、どんな関数をどのような順番で呼んで、どこで失敗したのか特定しろ。
324デフォルトの名無しさん:03/12/20 17:30
320です。
C++ではjavaから呼ばれる関数、
そこから呼ばれるWinMain()に相当する関数、
それとメインウィンドウとダイアログの
ウィンドウプロシージャを用意しました。

WinMain()に相当する関数ではメインウィンドウの登録、
メッセージループなど一般的なWin32SDKのWinMain()で
やるようなことをしています。
インスタンスハンドルはGetWindowLong()でデスクトップの
ハンドルを取っています。
メインウィンドウのウィンドウプロシージャでは、ダイアログを開くための
DialogBox()を呼んでいて、ここで失敗し−1が帰ってきます。
325デフォルトの名無しさん:03/12/20 17:32
わかりにくかったら申し訳ございませんが、よろしくお願いします。

320でした。
>>324
そんな説明されてもわからん。

オマエの説明じゃ埒明かんのでソース全部晒せ。
327デフォルトの名無しさん:03/12/20 21:48
>> インスタンスハンドルはGetWindowLong()でデスクトップの
>> ハンドルを取っています。
明らかにここだろ、問題は。DllMainのHANDLEを使えばいいのでは?
328デフォルトの名無しさん:03/12/21 04:32
320です。
できました!本当にありがとうございました。327さんのおっしゃる通りでした。
皆様何度もレス頂いて本当にありがとうございます。
329デフォルトの名無しさん:04/01/23 01:14
Cコードってデバッグできますか?
jdbでブレイクポイント設定しても止まってくれないです。
>>329
VC++でしかJNI作ったことないけど、停止できるよ。
ちゃんと実行するプロセスにjava.exe(に相当するもの)を指定してる?
331デフォルトの名無しさん:04/03/14 00:49
あんまり人いないね・・・なのであえてage。

最近USBデバイスと通信する必要があったのでJNIを試した。
で、下のようにエラーを通知しようとしたら、日本語文字列が化けますた。

jclass jc = env->FindClass( "java/io/IOException" );
env->ThrowNew( jc, "日本語文字列" );

下のサイトを参考にUnicodeに変換しても駄目。
http://www.ki.rim.or.jp/~kuro/Java/JNI/JNI-03.html

仕方ないのでExceptionのサブクラスを作ってエラーメッセージを固定した。
当初の目的は果たせんだけど、すっきりしない。誰か解決法知らない?
日本語で困ったことはないな。
お前のコードが腐ってるんだろうよ。さらしてみ。
333331:04/03/14 01:11
上のサイトの一番下のDLL側コードの
char* src = "こんばんわ";
より下のソースをreturn result; → env->ThrowNew( jc, result);に
変更しただけなんだけど・・・
そのサイトのコードそのままだと日本語はちゃんとでるの?
>> env->ThrowNew( jc, result);に
2番目、jstringじゃだめでしょ。
szWideでいけない?
336デフォルトの名無しさん:04/03/14 03:25
CのプログラムからHORB(つまりJAVAをつかった関数)をつかって離れた端末の関数をたたくってことはできますか?
>>336
できるよ。

HORB使うと決まっているのなら、CのプロセスとJavaのプロセスを両方たてて、
socketなんかでプロセス間通信したほうが楽だと思う。
338デフォルトの名無しさん:04/03/14 04:09
>>337
情報ありがとうございます。

それならば、Cのプロセスと離れた端末のCのプロセスでソケット通信した方がいいですね。
HORBは、非常に簡単に離れた端末の関数をたたけるのは知っています。
C<->JAVA間のインタフェース設計が、普通に関数をたたくように設計でき、かつ簡単ならばチャレンジしようかなと思ったしだいです。
なぜにいまさらHORB?
RMI-IIOPするほうが現実的かと。
340331:04/03/15 23:35
試した結果、>331であげたサイトのままだと無理だった。
nWideLength以下を下のように変更すると日本語を正しく表示できた。

int nWideLength = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,src, strlen(src),0,0);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,src, strlen(src),szWide,nWideLength);
jstring result = env->NewString(szWide, nWideLength);
return result;

で、そのままreturn result; だけをenv->ThrowNew(jc,result);もenv->ThrowNew(jc,szWide);
にしても日本語は文字化けしたままだ。もうだめぽ。
んー、そこまではできてるなら
ThrowNewはあきらめてThrowを使うとか。
Exceptionのインスタンスはjstring引数にして生成する。
342341:04/03/16 01:35
あー、わかった。そこでできてるWCHARを
WideCharToMultiByteでCP_UTF8のcharにして渡せばいいんだ。
ThrowNewのchar*が食えるのは、なるたけメモリを確保せずにthrowするための
緊急回避なんじゃねえかなあ。
Java側 → Win32dllは、JNIにて実現できる通信ですが、
Win32exe(プロセス) → Java側を実現するには、どのような手段が一番いいですかね?

アプリケーション間通信だけできればいいので、できればあまり大げさにはしたくないです。
Win32間でないからパイプは無理だし、一つのOS上での通信なのでソケット通信は少々大げさかなと。
>>344
>Win32間でないからパイプは無理
嘘だろ?
>>345
Javaでパイプ使えるか?
Win32API中のパイプ関連のAPIを全てJNIでラップしたら
使えるんでないの?
>>345 Javaでパイプは使えるよ。
>>348
それって、Javaのスレッド間通信のためのパイプであって、Win32-Java間のパイプではないんでないの?
>>348
それって NIO の Pipe の事いってんの?

個人的には >>347 で NIO の Pipe 実装するのが良いかと。
>>349 パイプって標準入出力みたいにOSが提供する入出力だろ。名前付きでも、名前無しでも。
>>351
OSが提供する入出力を、Javaは間接的にしか利用できないから、
それを使ってWin32とは対話できないのでは。
win32の中でJVMを生成する、ってのはダメなの?
> 一つのOS上での通信なのでソケット通信は少々大げさかなと。

これが一番やりやすいと思う。
355デフォルトの名無しさん:04/06/04 21:22
SWIGの日本語ページってどうなったか誰か知りませんか?
http://swig-jp.dyndns.org/exec_html

ちなみに本家http://www.swig.org/
おまえら、SolarisとLinuxプラットフォーム以外の環境で、
native内でシグナルハンドラ使うんじゃねーぞ。
native内でC++例外使うとcatchしているにもかかわらず落ちるバグは
直ったんですかね?(linux)
358 :04/06/30 11:18
パッケージを使ったJNIで質問です。

C:\home\javaにhoge.javaを置いてコンパイル
hoge.javaはパッケージfooに置くことにする
ここまでで hoge.java ->C:\home\java
hoge.class->C:\home\java\foo

javah -jni foo.hogeでヘッダファイル作成。
foo_hoge.hを元にしてfoo_hoge.cppを作成。
リンクしてhoge.DLLを作成
ここまでで foo_hoge.h, foo_hoge.cpp -> C:\home\java
hoge.dll -> C:\home\java\foo

この後、C:\home\javaからjava foo.hogeを実行すると
UnsatisfiedLinkError例外が発生してしまいます。
hoge.java内のSystem.loadLibrary("hoge")で
エラーが発生しているとコンパイラは怒ってますが原因がわかりません

識者の方々、アドバイスお願いします。
>>358
dll の置き場所が悪い。
360358:04/06/30 11:41
dllファイルを*.javaファイルと同じ場所に置いたら上手く動作しました。
てっきり*.classファイルと同じ場所に置くものと勘違いしてました。
>>359様、ありがとうございました。
361デフォルトの名無しさん:04/08/12 01:04
「-> か ->* の左には構造体のポインタが必要」

nativeのソース(C言語)をコンパイルすると上のようなエラーが出るのですがなぜですか?
エラーが出ている箇所は以下の文です。

return env->NewStringUTF("Hello World");

インクルードパスはきちんと追加しています。
javahで作成したヘッダもインクルードしています。
JNIのこと知らんが、こうしてみたら?
return NewStringUTF(env, "Hello Wrold");
C と C++ じゃ JNI の呼び出し方が違う。C だと
return (*env)->NewStringUTF(env, "Hello World");
としなければいけないはず。
364361:04/08/13 01:14
ありがとうございます。解決しました。
もう一つ質問があるのですが、java側で用意したint型の二次元配列にnative側から値を入れる方法がわかりません。
色々とやってみたんですが、実行時にエラーが出てしまいます。
エラー?
366361:04/08/13 04:58
/*JAVA側のソース*/
public class HelloJNI{

public static native void JNITest(int intAry[][]);

static{System.loadLibrary("HelloJNI");}

public static void main(String args[]){
int intAry[][] = new int[64][64];
for(int i=0; i<12;i++){
for(int j=0; j<16;j++){
intAry[i][j] = 0;
}
}
JNITest(intAry);
for(int i=0;i<12;i++){
for(int j=0;j<16;j++){
System.out.print(intAry[i][j]+" ");
}
}
System.out.println("--------------------------");
}
}
367361:04/08/13 04:59
/*native側のソース*/

#include <stdio.h>
#include "HelloJNI.h"

JNIEXPORT void JNICALL Java_HelloJNI_JNITest
(JNIEnv *env, jclass clazz, jobjectArray jobjArray){
int i, j;
int c=0;

jobject **array = (*env)->GetObjectArrayElement(env, jobjArray, NULL);


for(i = 0; i<12;i++){
for(j=0;j<16;j++){
array[i][j] = c;
c++;
}
}
(*env)->ReleaseIntArrayElements(env, jobjArray, array,0);
}
368361:04/08/13 05:03
intAryに0,1,2,3,4,…
というふうに値を入れたいのですが、どうすればいいですか?
>>367
試してないので間違ってるかもしれんが こんな感じにしないとダメじゃないか?

for(i = 0; i < (*env)->GetArrayLength(env, jobjArray); i++){
 jintArray jintarray = (jintArray)(*env)->GetObjectArrayElement(env, jobjArray);
 jint *jint = (*env)->GetIntArrayElements(env, jintarray, NULL);
 for(j = 0 ; j < (*env)->GetArrayLength(env, jintarray); j++){
  jint[j] = c++;
 }
 (*env)->ReleaseIntArrayElements(env, jintarray, 0);
}
#ifdef __cplusplus
#define ENV (*env)
#else
#define ENV env
#endif


ENV->GetArrayLength(env, array);
>>370
それC++じゃコンパイル通らんだろ。
372デフォルトの名無しさん:04/10/14 01:11:03
>>370
逆じゃないの?
373デフォルトの名無しさん:04/10/14 02:56:47
逆ではあるが、それを正したところでC++じゃだめだし。
374デフォルトの名無しさん:04/12/09 00:41:58
JNIでdefineClassメソッドを使ってbyte配列から取得したクラス情報を元に、インスタンスって生成できますか?
それにしても、JNIのDefineClassってどうやって使うんだろう・・。
375デフォルトの名無しさん:04/12/09 00:48:26
DefineClassってJNIじゃないだろ
376374:04/12/09 00:55:46
>>375
クラス操作 DefineClass
jclass DefineClass(JNIEnv *env, jobject loader, const jbyte *buf, jsize bufLen);
raw クラスデータのバッファからクラスをロードします。
パラメータ:
env: JNI インタフェースポインタ
loader: 定義されたクラスに割り当てられるクラスローダ
buf: .classファイルデータを含むバッファ
bufLen: バッファ長
戻り値: クラスオブジェクトを返します。エラーが発生した場合は null を返します。

ttp://java.sun.com/j2se/1.4/ja/docs/ja/guide/jni/spec/functions.doc.html
377デフォルトの名無しさん:04/12/09 01:17:16
いや、それやりたいのならJNI必要ないだろうという意味だ
コアAPIでできるんだから
378374:04/12/09 07:48:29
>>377
それをネイティブコードでかけるかという質問なんです。
379デフォルトの名無しさん:04/12/09 08:06:41
>>378
書けるだろ。
JNIじゃなくてJavaのクラスファイルに関する知識が必要になるだけで。
380デフォルトの名無しさん:04/12/09 13:37:48
>>374がどういった場面でこれを使おうとしているのかわからない・・・
381374:04/12/09 21:56:27
>>379
Javaオンリーでは実装したことあるのですが、
JNIに移植したとたんセキュリティエラーになりませんか?
382デフォルトの名無しさん:04/12/09 22:58:25
あふぉぅな質問するけどよ

JNIって何て読むの??

ジニ??
ジェイエヌアイ


読めなくて"Java Native Interface "って読んでまつ。。
383デフォルトの名無しさん:04/12/09 22:59:57
IT用語辞典 e-Words : JNIとは 【Java Native Interface】 ─ 意味・解説
http://e-words.jp/w/JNI.html
384デフォルトの名無しさん:04/12/11 12:30:12
>>379
書いてみて。
385デフォルトの名無しさん:04/12/11 12:32:09
書いてみた。
386デフォルトの名無しさん:04/12/11 12:52:25
>>385
ん?どこに?
387デフォルトの名無しさん:04/12/13 13:46:25
.netのC#で作った.dllファイルでJNIってできませんか?
388デフォルトの名無しさん:04/12/13 18:49:12
>>387
それを言うなら
#NI(シャープニー)だろ?
グぐれ
389デフォルトの名無しさん:04/12/14 03:15:20
>>387
.netのC#で作った.dllファイルのメソッドを呼ぶdllを作ればいい
390デフォルトの名無しさん:04/12/18 21:10:34
>>376
JNIインタフェースのDefineClassって、
バージョン毎にシグネチャが異なるのか?
それともヘルプが間違ってるだけなのか?

あと使い方誰か教えてくれ。
何度やってもネイティブコード上でうまくインスタンスを取得できない。
391デフォルトの名無しさん:04/12/18 21:48:44
392デフォルトの名無しさん:04/12/18 22:24:33
>>391
……上手くいかない理由がわかったような気がする。
393390:04/12/18 23:04:05
>>392
教えてくれ!
何が原因なんだ。
つーか、仕様上無理なのか?
394デフォルトの名無しさん:04/12/18 23:08:43
つーか、バイトコードを暗号化しても、すぐにやぶられるって。
395デフォルトの名無しさん:04/12/18 23:10:13
>>394
>>390 がやっても、ってんなら同意。
396デフォルトの名無しさん:04/12/19 13:04:15
どうせVMが実行するときにデコードしてるんだからいみないな
397390:04/12/19 13:40:24
>>394
>>395
>>396
そこからクラスファイルを生成し、ソース入手可と言っている?
398デフォルトの名無しさん:04/12/19 15:41:10
> そこからクラスファイルを生成し、ソース入手可と言っている?
可能。

せいぜい>390がいくら頑張っても、Jad使ってお手軽一発変換、ってのを防ぐ程度の
ことしかできんだろう。
399デフォルトの名無しさん:04/12/19 16:02:26
そういうこと

苦労してJNIでクラスローダ作ったところでいくらでもいじられるんだし
JNIのコードだってスタックサイズの制限とかで大きいの作れないんだから
余裕で解析されるだろうな

それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
毎回ロードするほうがまだ現実的

ネトゲとかでいくらネイティブコードでもbotとかツールとかなくせないわけだしね
安全性のためにJNIってのは意味ない
400デフォルトの名無しさん:04/12/20 00:03:00
>>399
> それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
> 毎回ロードするほうがまだ現実的

「まだ現実的」ってのがどういうことを意図しているのかよくわからんが、
JNIでクラスローダ作るのって大した手間じゃないし
ネットワークを意識しなきゃならんほうがいろいろ面倒だと思うがね。
401390:04/12/20 00:21:26
>>399
> それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
> 毎回ロードするほうがまだ現実的
それこそURLクラスローダクラスをリバースコンパイルされるので、無意味のような気が・・・。
データの暗号化で無く、データを扱うモジュールの暗号化をここでは問題視しているんです。

>>400
>JNIでクラスローダ作るのって大した手間じゃないし
おお!本当ですか?
是非是非ソースレベルで教えてください。
先ほどちょっと妥協して試してみたんですが、
FileInputStreamをJNIで実装しようとしたんですが、
これもやはりうまくいきませんでした・・。
JNI、むずいっす。
402デフォルトの名無しさん:04/12/20 00:48:32
クラスが暗号化されようとJREの上で動くときには普通のクラスだろ
403デフォルトの名無しさん:04/12/20 11:22:32
たぶん390はVMの中は外から絶対のぞけないと思い込んでいるに一票。
404デフォルトの名無しさん:04/12/20 21:43:16
この辺を参考にしてから googleで検索してみろ
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/jni/spec/functions.doc.html#15982
405デフォルトの名無しさん:04/12/21 13:59:21
初歩的な質問かもしれませんが、教えてください。

JavaからJNIを利用して既存のdllにアクセスする場合、オススメの方法はあるでしょうか?
何通りかあるのかもしれませんが...。
「既存のdllは一切変更しない」ことが条件です。
たとえば、間にラッパー(?)をかますとして
「dllを指定し、利用するAPIを選択すると自動でラッパー(またはそのベース部分)を生成してくれるツール」とか...。
Java以外の言語にも精通し、JNIゴリゴリが得意な方は不要かもしれませんが、
「JavaからJNIを利用して既存のdllにアクセスする」を目的とする場合、需要があると思うのですが?

よろしくお願いします。
406デフォルトの名無しさん:04/12/21 16:15:32
ラッパーつくるしかないよ

大概符号つきをどうするかとかその辺があるわけで
407デフォルトの名無しさん:04/12/23 18:18:03
質問ですが、一般的にJNIといった場合、JVMTI,JVMPI,JVMDI等はその中に含まれると考えていいのでしょうか?
408デフォルトの名無しさん:04/12/23 19:17:20
それらすべてともちがうかと
JNIといった場合はネイティブコードを呼び出す、もしくはネイティブコードからJVMを呼び出すのが目的だから

ってすべて検索すれば詳細出てくるんだが釣り?
409デフォルトの名無しさん:05/02/10 02:40:02
知恵を貸して下さい.

現在CからJavaを呼び出すコードを書いています.
Javaのコードを呼び出す度にJVMを生成するのはコストが大きいと思われるで,
改善したいと思っていますが良い方法が分かりません.
現在のコードを抽象化して以下に示します.

int main(void){ for(int i=0;i<500;i++){ hoge(); } return 0; }

void hoge(void)
{
...
JNI_GetDefaultJavaVMInitArgs...
JNI_CreateJavaVM...
env->CallStaticVoidMethod...
jvm->DestroyJavaVM...
...
}

public class HelloVM { static void hello() { System.out.println("HelloVM(Java) executed.\n"); } }

現在は上記の様な感じで,500回helloメソッドを呼ぶ度にJVMを作成しています.
しかしこれでは作成に失敗することが多々あります.
もっと良い方法はないでしょうか?
410デフォルトの名無しさん:05/02/10 03:04:34
> 失敗する

どのような失敗
411409:05/02/11 03:38:07
>>410
2回目以降の JNI_CreateJavaVM が失敗しているって感じです.
今は手元にコードがないので,後日詳細な報告をします.
412409:05/02/12 06:25:57
>>410
例えば下記のサイトのコードを流用したとします.
ttp://www.ki.rim.or.jp/~kuro/Java/JNI/JNI-07.html

public class HelloVM { static void hello() { System.out.println("HelloVM(Java) executed.\n");} }

#include "stdafx.h"
#include "jni.h"

int hoge(void)
{
// 前略
nResult = JNI_GetDefaultJavaVMInitArgs(&vm_args);
if ( nResult == 0 ) { printf("Success to JNI_GetDefaultJavaVMInitArgs vm.\n");}
else { printf("Fail to JNI_GetDefaultJavaVMInitArgs vm.\n"); }
// 中略
nResult = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if ( nResult == 0 ) { printf("Success to create vm.\n"); }
else { printf("Fail to create vm. [%ld]\n", nResult); return 0; }
// 後略
return 0;
}

int main(void){ for(int i=0;i<3;i++){ hoge(); } return0; }

こんな感じのコードを実行すると,ループの初回は HelloVM(Java) executed. が出力されます.
しかしループの2回目は Fail to create vm. が出力されます.
このことからJVMの作成に失敗したと考えました.
# 当然ですが上記のようなループを含まないJNIのプログラムは正常に動作します.

現在は AttachCurrentThread と DetachCurrentThread が,
関連するのではないかと思っているのですが間違っていますでしょうか.
413デフォルトの名無しさん:05/02/12 09:51:15
エラーコード・・・
414デフォルトの名無しさん:05/02/12 14:03:45
>>412
エラーコードを出し惜しみするのは宗教上の理由か?もう答える気なくした。
415409:05/02/12 15:59:55
あーすいませんorz

エラーコードは -1 が返ってきているのですが jni.h で確認したところ
JNI_ERR (-1) /* unknown error */
ってことは…原因は何なんでしょ.
416デフォルトの名無しさん:05/02/13 23:58:42
DLLからJavaのメソッドって呼べる?
417デフォルトの名無しさん:05/02/14 00:30:03
超呼べる。呼びまくり。
418デフォルトの名無しさん:05/02/14 02:40:44
>>417
おぉJNIって凄いんだ

それってDLLの中でJVMを作成して?
それともよくあるサンプルみたいにコールバックでって意味で?
419デフォルトの名無しさん:05/02/14 09:23:52
どっちがやりたいん?
ほとんどの場合はnative methodの実装ですむはずだけど・・・
420デフォルトの名無しさん:05/02/14 11:04:52
どっちて言いますか…

EXE→DLL→Javaのメソッドって感じにしたいんです
それで普通にEXEからJavaのメソッドを呼ぶ方法は分かるんです
でもDLLの中でJVMを作成して呼ぶ方法を試していて失敗してるんです
ClassFindって関数で失敗してるんで、クラスパスの設定あたりかもしれないんですけどorz

それで>>418の質問をしたんです
どうかDLLの中でJVMを作成して、そこからJavaを呼ぶ方法を教えてください
421デフォルトの名無しさん:05/02/14 19:30:01
え、ClassFindのエラーの原因を調べればいいんじゃないの
422デフォルトの名無しさん:05/02/22 19:48:43
面白そうなことやってるな
423デフォルトの名無しさん:2005/06/17(金) 17:21:30
NIOっていうかDirectByteBufferを駆使しようぜ
424デフォルトの名無しさん:2005/06/19(日) 13:16:52
jarファイルをexeに変換するexewrapというツールがある。
これソースを公開してる。JNI使ってVM作ったり、
exe埋め込みリソースからクラスを生成しているようなので
参考になるかもしれんよ。
425デフォルトの名無しさん:2005/06/19(日) 13:45:58
DirectByteBufferってアレだな
X11のshm拡張に似たものがあるな

単なるバイト列をやり取りする需要ってどんなもんだろう
画像とかか?
426デフォルトの名無しさん:2005/06/19(日) 14:31:18
でもデスクトップ上で扱うタイプなら単純なバイト列というより
BufferedImageとかで扱うことが多いもんだから
shortやint型配列とかのほうがオーバーヘッドもないし便利
427デフォルトの名無しさん:2005/07/06(水) 23:21:04
LinuxでJNIで何か処理をすると、StackOverflowErrorが発生するのですが、
何か情報ないでしょうか?
428デフォルトの名無しさん:2005/07/06(水) 23:58:15
Windowsでも同じく発生するよ
スタックはかなり小さくないと動かない模様

Java自体のソースコードを修正してコンパイルしなおしが必要
429デフォルトの名無しさん:2005/07/07(木) 00:06:36
>>425
ByteBufferからIntBufferやShortBufferに変換できるから無問題
430デフォルトの名無しさん:2005/07/07(木) 00:20:21
>>428
Windowsで同じソース(ネイティブコードは除く。ただし、処理内容は同じ)を走らせても
StackOverflowError は発生しないのにLinuxでは発生してしまいます。
何が原因なのか調べる手段だけでもアドバイスもらえないでしょうか?
431デフォルトの名無しさん:2005/07/07(木) 00:48:35
432デフォルトの名無しさん:2005/07/07(木) 00:57:08
残念ながらJNIのスタックサイズは有効にならないよ
433デフォルトの名無しさん:2005/07/07(木) 00:58:14
>>430
Java自体のコンパイルってのはVMのことね

J2SE5.0の新しいライセンスでダウンロードしてコンパイルしなおすしかない
434デフォルトの名無しさん:2005/07/07(木) 20:52:39
>>433
残念ながら、アプリの配布をVMと一緒にという訳にはいかないので
何か違う方法を探してみます。
ちなみに、JNIに関わりの無いところでは、相当量のスタックを使ってもオーバーフローしていません。
435デフォルトの名無しさん:2005/07/07(木) 21:06:17
>>434
当たり前
Javaのスタックとはまったく別物だし
436デフォルトの名無しさん:2005/07/08(金) 00:21:16
原因が分かりました。
ネイティブ側のメモリリークに、ガーベッジが重なったときにVMがアボートしていました。
どうりで特定の場所で落ちない訳です。
StackOverflowErrorはVMが異常な状態のときにスローされていたので、
恐らく関数ポインタがズレたせいだと思います。
437デフォルトの名無しさん:2005/10/02(日) 14:10:30
>>425
亀レスやけど、
DDAとか、memory mapped I/Oとか、
特に組み込みでVRAMなんかに使うんでしょ。
438デフォルトの名無しさん:2005/10/04(火) 15:07:02
DLL から JNI を呼ぶ場合、DestroyJavaVM()は、他にJavaVMを使用中の
スレッドが存在すると JavaVM がアンロードできないみたい。
(DestroyJavaVM() で終了まちになる・・・)

強制的に DestroyJavaVM() でJavaVMをアンロードする方法ってあるの?
439デフォルトの名無しさん:2005/10/04(火) 17:07:35
えーと、マルチスレッドプログラミングの基本なんですが、
スレッドは、各々自分の責任において、終了処理を行うべきです。
// Thread.stop()がdeprecatedであるのと同じ理由。
ですから、JVM内できちんとThreadの終了を行うのが正当なやり方です。

どうしても強制的に終了したければ、
JVMのなかでdeprecatedなThread.stop()を矯正終了用のmethodで使ってみてください。
http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
440デフォルトの名無しさん:2005/12/19(月) 19:39:34
Cで作ったクラスインスタンスや構造体をJavaに渡すことは可能?
Javaで使えなくても、次のDLLの関数呼びに使うために
441デフォルトの名無しさん:2005/12/21(水) 09:03:27
long値にポインタつっこもうぜ
442デフォルトの名無しさん:2005/12/21(水) 20:11:40
それでDLL側で作ったメモリの領域が保たれるのか。
CとJava別個に考えてたけど、普通に使えるのね。
やってみる。
443デフォルトの名無しさん:2005/12/21(水) 23:30:29
保たれはせんだろ。単なるポインタだし。
444ハーピィ:2005/12/24(土) 01:08:28
E・∇・ヨノシ <444ゲット♫
445デフォルトの名無しさん:2006/02/15(水) 11:09:40
消えちゃ勿体ないのでageちゃいます
446デフォ:2006/03/18(土) 14:47:41
ふんとだもっだいね。
447デフォルトの名無しさん:2006/03/24(金) 11:41:57
Bufferクラスって
JNIで実装されてるんだよね
448デフォルトの名無しさん:2006/03/27(月) 14:03:54
外部メモリを取るやつがあるからな
449デフォルトの名無しさん:2006/04/09(日) 08:02:11
void getValues(long &x, long &y);
のような関数をJNIで呼びたいのですが、
それにはx, y をメンバーに持つオブジェクトを使う
しかないのでしょうか?
450デフォルトの名無しさん:2006/04/09(日) 21:19:38
そう。
あとその質問にJNIは関係ない。
451デフォルトの名無しさん:2006/04/15(土) 16:32:50
cygwin環境でjava動かしてるんだけど.soって読み込む方法ってあるかな?
452デフォルトの名無しさん:2006/04/17(月) 08:22:40
Windows XP SP2
Java 2 SDK 5
JavaからDLL内のCの関数呼び出して、さらにそのCの関数の中から
Javaのメソッド呼び出すことはできるんだけど、
CからJNI_CreateVMで直接Java VMを生成しようとすると失敗します。
上記の環境に加えてjvm.dllにパスが通っているだけではだめなんでしょうか?
JNI_CreateVMの戻り値は-1です。
453デフォルトの名無しさん:2006/04/17(月) 10:08:07
すみません、JNI_CreateJavaVM の間違いでした。
JREをインスコすると C:\Windows\java.exe が
インストールされるので、Java プログラムを
実行している分にはパスのことを気にしなくてもいいんですが、
JNI でごりごり遊ぶにはいろいろとパスを通さなくては
なりませんか?面倒なのでネイティブプログラムと
同じディレクトリに jvm.dll をコピーしてるんですが。
454デフォルトの名無しさん:2006/04/17(月) 13:20:39
> 同じディレクトリに jvm.dll をコピーしてるんですが。
これが原因と見た。
455デフォルトの名無しさん:2006/04/17(月) 13:26:35
>>454 やっぱそうですか・・・
Windows で JNI で遊んでる皆さん、
よかったらJava関連ではどこにPATHを通してるか、
さらしてもらえませんか??

>>452 のように Java アプリから呼び出した
C の関数から、さらに Java のメソッドを
コールバックさせることはできているので、
まったく何もかもがうまくいっていない、
というわけじゃないと思うんです。
456デフォルトの名無しさん:2006/04/17(月) 15:09:26
息長ぇなこのスレ。
457デフォルトの名無しさん:2006/04/18(火) 00:04:55
Java Forums - can't create java vm ... setting path for jvm.dll
http://forum.java.sun.com/thread.jspa?messageID=4176546
この辺も眺めながらもういっぺんトライしてみます。
458デフォルトの名無しさん:2006/04/19(水) 02:48:31
質問です。
Java 5から導入されたアノテーション情報(特にクラスに埋め込んであるタイプのもの)に、
JNIからアクセスできるのでしょうか。

SunのサイトにJNI 5.0とかいうのがあったので見てたのですが、それらしいものは見つかり
ませんでした。どんなものでしょうか。
459デフォルトの名無しさん:2006/04/19(水) 08:33:43
JAVAからJVMのメリットをなくしたらデメリットしか残らない
460デフォルトの名無しさん:2006/05/22(月) 09:43:09
JNIでネイティブのDLLを呼び出すJAVAアプリ作ったんだけど、
JARファイルにまとめると動いてくれないよ。(エラーも出ずに何も反応無く終了する)
JARファイル中のDLLを読み込むにはloadLibraryかloadじゃなくて
findLibraryかなにかで読み込めば良いの?
461デフォルトの名無しさん:2006/05/22(月) 10:00:30
>>460
標準のJNIのローダーはjarに対応してたっけ?
ネイティブのファイルシステムに置いて無いとダメじゃないのか?
462460:2006/05/22(月) 14:03:16
>>461
即レスあんがと。
レス424のexewrapを使ってGUIでexeにしてみると

java.lang.UnsatisfiedLinkError: no dllname in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
以下略
ってエラーログ出てたのでDLL読めてないみたいです。

試しに、DLLを含めずにJAR作って、別途フルパス指定でHDD上のDLLをloadすると
動きました。
463デフォルトの名無しさん:2006/05/22(月) 14:44:43
DLLはJavaの仕組みではなくWindowsの仕組みだからな。
464デフォルトの名無しさん:2006/06/27(火) 09:56:25
465デフォルトの名無しさん:2006/07/04(火) 21:18:40
時給1000円でJava教えてくださるかたを募集します
場所 所沢(池袋・高田馬場から直通)

i−want−to−study−java@hotmail.co.jp
(アドレスは全角で書いてあるので半角に直してください)
よろしくおねがいします
466デフォルトの名無しさん:2006/07/05(水) 02:21:36
コンビニのバイトより安いですが、よろしくお願いします。
467デフォルトの名無しさん:2006/07/05(水) 21:37:03
もち交通費別だよな
468デフォルトの名無しさん:2006/07/05(水) 23:55:10
値段交渉したら、時給上げてくれた
469デフォルトの名無しさん:2006/07/12(水) 10:54:51
はじめまして,今までJavaしか触ったことがなかったのですが,
470469:2006/07/12(水) 11:11:20
すみません,間違えてエンター押しちゃいました;;
Win32APIを使う必要があり,JNIにを使い始めたものです.

C++側でから渡されたString型の引数はjchar型として扱うようなのですが,
jchar→WCHARの変換はどのようにすればよいのでしょうか?

const WCHAR *Uni = env->GetStringChars(jstring, NULL);

のようにすれば普通にWCHAR形式として取り込めると書いているページも
あったのですが,こちらの環境では

> 'const jchar' から 'const WCHAR *' に変換できません。

とエラーがでます.
ttp://www.ki.rim.or.jp/~kuro/Java/JNI/JNI-03.html
を参考にして,せめてWideCharToMultiByteを使ってSHIFT_JISに変換しようとしても,

>'WideCharToMultiByte' : 3 番目の引数を 'const jchar *' から 'LPCWSTR' に変換できません。

とエラーがでます.
どのようにすればjchar→WCHARの変換ができるのでしょうか?
当方の環境は
Java
jdk 1.5.0_06
Eclipse 3.1(Java5でコンパイル)
c++
VC++2005 Express
です.
471デフォルトの名無しさん:2006/07/12(水) 13:09:44
CHAR *GetStringFromJstring(JNIEnv *env, jstring jstr)
{
CHAR *sjisCode = 0;
INT32ret = 0;
const jchar *jchr = 0;
INT32jlen = 0;

// jstringがNULLではないときのみ処理を行う
if(jstr != NULL)
{
// 文字列、文字長の取得
jchr = env->GetStringChars(jstr, NULL);
jlen = env->GetStringLength(jstr);

// バッファの確保(すべて2バイト文字だった場合を想定)
sjisCode = (CHAR *)malloc(jlen * 2 + 1);
if (sjisCode != NULL)
{// メモリ確保成功
memset(sjisCode, 0, (jlen * 2 + 1));
// コード変換
ret = WideCharToMultiByte(CP_ACP, 0, jchr, jlen, sjisCode, jlen * 2 + 1, NULL, NULL);
sjisCode[ret] = '\0';
}

// 取得文字列の開放
env->ReleaseStringChars(jstr, jchr);
}
return sjisCode;
}
472469:2006/07/12(水) 14:15:25
>>471
ありがとうございます.早速試してみます.
また何かあったら,書き込むかもしれないのでよろしくお願いします.
473469:2006/07/12(水) 14:25:36
>>471
連続ですみません.
>ret = WideCharToMultiByte(CP_ACP, 0, jchr, jlen, sjisCode, jlen * 2 + 1, NULL, NULL);
やはりの部分で
>3 番目の引数を 'const jchar *' から 'LPCWSTR' に変換できません。
と出てしまいます.

なにか宣言が抜けたりしているのでしょうか?
474471:2006/07/12(水) 15:02:49
VisualStudio6.0SP6の環境では問題無くコンパイルして動作しておりましたが、
VC++2005 Expressで駄目な理由は判りかねます…。
475471:2006/07/12(水) 15:25:57
(LPCWSTR)jchr
明示的にキャストしても駄目でしょうか?
476469:2006/07/12(水) 21:07:20
>>475
ありがとうございます!!
無事にできました.今までずっとJavaしか触ったことがなかったのですが,
今回C++を触り始めて改めてJavaのありがたさを思い知ってます.
477デフォルトの名無しさん:2006/07/17(月) 20:59:54
時給1000円でJava教えてくださるかたを募集します
場所 所沢(池袋・高田馬場から直通)
よろしくおねがいします
i−want−to−study−java@hotmail.co.jp
教える対象は超初心者です。

専門学校などでJavaを勉強されていて夏休みだけ教えたいという方も歓迎です
478デフォルトの名無しさん:2006/07/18(火) 05:15:38
> 465-468
479デフォルトの名無しさん:2006/09/05(火) 22:25:34
JNIの勉強をしているのですが,CPU使用率のように連続的にデータを取得する際,
Java側からwhileループをまわして何度もdllを読み込むという非効率な方法をとっています.
一度dllを呼び出すだけで連続的に返り値を読み取る方法はあるのでしょうか
ご教授お願いします.
480デフォルトの名無しさん:2006/09/05(火) 22:36:18
>>479
dll読み込む、dll呼び出すってのが、具体的に何を指して言ってるのかわからん。
481479:2006/09/07(木) 12:53:19
>>480
言葉が足りなくてすみません.
dll読み込む、dll呼び出すというのは,ネイティブメソッドを実行するという意味で書きました.
現在はネイティブメソッド実行時に,返り値としてCPU使用率を取得しているのですが,
この方法ではJava側でWhileループで何度もネイティブメソッドを実行する必要があります.
ネイティブメソッド側でWhileループをつかってJavaに連続的に値を返す方法は
ないのでしょうか
482デフォルトの名無しさん:2006/09/07(木) 18:52:07
>>481
ネイティブ側では java.nio.ByteBuffer#allocateDirect(int) で得られるバッファに随時書き込んで
Java側はポーリングするだけ、とかならメソッド呼び出しの負荷は減るかもしらん。
ただし、取りこぼしが考えられるので完全な連続性は保証できないし
同期処理とかを考えると取り扱いはかなり面倒になるし、
同期処理は下手すりゃネイティブメソッド呼び出しよりも高くつく可能性もある。
自分の技術力とか、CPU使用率がどれだけ必要なのかとかを良く考えた方が良いかも。

ま、裏技的な事をする前にネイティブメソッド呼び出しが
本当にボトルネックになってるのか検証する事をオススメするけどね。
何の検証もせずに、ネイティブメソッド呼び出しが遅いとか聞きかじった程度なら、
上記みたいな事をしても無駄だと思う。
483デフォルトの名無しさん:2006/09/10(日) 12:57:34
>>481
dllでOSのスレッド作って、そのスレッドでjvmにアタッチして、
whileループ回しながら、適時、Listener経由でコールバック。
484デフォルトの名無しさん:2006/09/11(月) 01:39:27
>>483
結局ネイティブ->Javaのメソッド呼び出しのコストが必要になるけどね。
485名無しさん@お腹いっぱい。:2006/12/07(木) 15:12:29
486デフォルトの名無しさん:2006/12/07(木) 19:57:23
Cで書いたプログラム上でJVMを生成して、クラスをロードしようと思ってるんだけど、
Invocation APIでJVMを作るサンプルができたので、デバッグメッセージをファイルにだそうとしたら、セグメンテーションフォルトで落ちるようになってしまった。
いろいろ削っていって、

FILE* f;

↑この一行があるかないかだけで、セグ(ryが起きるかどうかが変わるんだが、
これどう解決したらいいだろうか?
487デフォルトの名無しさん:2006/12/07(木) 22:19:52
Java専用のCコンパイラがあったらなとは思う。
ソースコード一式セットしておけば
Antみたいのが走ってそのOS向けにビルドとか。

dllとかいちいち作らせるのも忍びない
488デフォルトの名無しさん:2007/04/22(日) 23:55:47
 
489デフォルトの名無しさん:2007/05/26(土) 21:11:12
Java Native Access (JNA): access native libraries with pure Java code.
https://jna.dev.java.net/
JNative, Java framework for DLL access for Windows and Linux
http://jnative.free.fr/SPIP-v1-8-3/
nlink: NLink - Native Library Linker:
https://nlink.dev.java.net/
490デフォルトの名無しさん:2007/05/26(土) 22:56:51
JNIと何が違うの?
491デフォルトの名無しさん:2007/05/26(土) 22:58:03
>>490
自分で一切ネイティブコード書かなくて良い点が違うんでは?
492デフォルトの名無しさん:2007/05/27(日) 00:12:37
.NETでいうP/Invokeのようなもんか?
493デフォルトの名無しさん:2007/06/24(日) 11:08:18
すみません。
JavaからFortranのプログラム呼ぶことって可能なのでしょうか?

計算処理はFortranでやってて、それをJavaから呼ぶ必要があるんですが。
494デフォルトの名無しさん:2007/06/24(日) 19:48:04
ルーチン名がマングリングされないようにコンパイルすれば出来ると思う。
大文字に固定されるとか、末尾にアンダーが入るとかするなら
C言語でラッパを書けばいい。
495デフォルトの名無しさん:2007/07/27(金) 18:47:25
Java側からCクラスオブジェクト丸ごと読み込んで、中のメソッド制御したいんですが、
こういう使い方ってJNIで出来るんでしょうか?
496デフォルトの名無しさん:2007/07/27(金) 20:58:38
エスパー募集中
497デフォルトの名無しさん:2007/07/27(金) 21:44:17
できる
498デフォルトの名無しさん:2007/07/30(月) 12:01:58
jni使わないと、mmx, sseとか使えないんだね。
499デフォルトの名無しさん:2007/07/30(月) 14:34:39
jniの呼び出しオーバーヘッドで、mmxとかのメリット吹き飛ぶ予感
500デフォルトの名無しさん:2007/07/30(月) 19:01:48
それは気にし過ぎ。
2GのファイルとかにMMXするの考えてみて
501デフォルトの名無しさん:2007/07/30(月) 19:09:34
MMX使っても、メソッド呼び出し1回で 2Gのファイル処理しないとペイしないのか。
502デフォルトの名無しさん:2007/07/31(火) 04:49:18
比べる土俵が違うんじゃないか。
例えばMMXはJavaにはない機能なんだが、JNI使用しないとつかえないわけで。
503デフォルトの名無しさん:2007/07/31(火) 05:30:13
いみわからん
504デフォルトの名無しさん:2007/07/31(火) 07:46:43
>>503 おまえは あほか
505デフォルトの名無しさん:2007/07/31(火) 10:43:39
java vmのソースも公開されたことだし、jitコンパイラをハックして
mmx/sse等を使うようにしてみるのも楽しいかもね!
506デフォルトの名無しさん:2007/07/31(火) 12:58:02
>>502
>>504
速く処理を終わらせることが目的なのか、MMXを使うことが目的なのか。
大多数の人にとってはMMXは手段であって目的ではない。
507デフォルトの名無しさん:2007/07/31(火) 14:54:43
>>503 おまえ MMY つかったことないだろ
508デフォルトの名無しさん:2007/08/02(木) 12:00:16
>>506 おまえ MMZ つかったことないだろ
509デフォルトの名無しさん:2007/08/02(木) 19:16:27
JNIの呼び出し、戻しって遅いしね。つかえね〜
510デフォルトの名無しさん:2007/08/02(木) 19:50:22
MMWなら使った
511デフォルトの名無しさん:2007/08/02(木) 21:05:37
なんと!
512デフォルトの名無しさん:2007/08/03(金) 08:27:36
JNIのほうではmemcpy相当
Javaのほうではarraycopy相当

で1000万回やったけど、
native.dllのままで、8秒。
native.dllをcl /02 /GDで最適化して5秒。
arraycopy呼び出しは1秒。

JNIの関数呼び出し戻しって遅いよ。
どうにもならないだろうね。
513デフォルトの名無しさん:2007/08/03(金) 09:14:16
関数呼び出し戻しの時間を測定するために、ちょっとDLL作って計ってみた。
public static native long callfunc(long q);
public static long callmeth(long q)

で、引数を何もしないで返すだけ。clは/Ot /GA
100 000 000(1億回)で、
3435 mill
290 mill
およそ10倍。呼び出し回数が異常に多いと、JNIは遅すぎ。
514デフォルトの名無しさん:2007/08/03(金) 09:17:11
ああ、環境は、
windows 2000
jdk 1.6.0.1
cl vc++ 2005
515デフォルトの名無しさん:2007/08/03(金) 11:40:12
JNIコールが遅いってのは、javaプログラマの常識。
呼び出しそのものが遅いってのもあるけど、JNI関数内がJVMからみて不透明なので、
最適化の阻害要因にもなる。
JNI使うのは、JVM経由ではサポートされないプラットフォーム固有のリソースを使うとか、
画像処理なり数値演算なり、CPUパワーに強く依存する処理を大きな単位でC/C++化したりする
ときぐらい。
516デフォルトの名無しさん:2007/08/03(金) 12:55:49
でも呼び戻しが遅いから、その苦労は、相殺される。
517デフォルトの名無しさん:2007/08/03(金) 12:58:40
>>500が言うみたいに、2Gとかのファイル処理じゃないと割に合わんね。
518デフォルトの名無しさん:2007/08/03(金) 13:11:32
JVMでは、スクリプトばかりに日がさしているけど、
JNIが日の目を見るのはいつなのか・・
519デフォルトの名無しさん:2007/08/03(金) 16:09:45
JVM内に取り込めばいいだけの話だろ
オープンソースなんだし
520デフォルトの名無しさん:2007/08/03(金) 16:13:36
JVM内に取り込むって、どーゆー事?
521デフォルトの名無しさん:2007/08/03(金) 16:22:38
>>517
それだけJavaも進化したものだとつくづく思う
522デフォルトの名無しさん:2007/08/04(土) 07:18:12
>>520
JNIなしでネイティブを呼び出す
523デフォルトの名無しさん:2007/08/04(土) 09:43:46
しかし、関数呼び出しがこれほど遅いとはおもわなんだ。
1億回も呼び出すことはないかもしれんが、100万回ぐらいは普通にあるだろ。
in.read()を100万回だと、1Gのファイル処理になるから。
524デフォルトの名無しさん:2007/08/04(土) 09:45:58
100万で1Mファイルだった。
525デフォルトの名無しさん:2007/08/04(土) 12:01:59
>>522
GC管理外にオブジェクト持ち出すための準備はJNIでなくても必要になるだろうし、
JITコンパイラがネイティブコードとJavaのコードを混ぜて最適化ってのも期待できないから
仮にJNIなしでネイティブ呼び出ししても、呼び出しコストが高くなるのは変わらんと思うよ。

期待できるのはJNIって名前が変わる事ぐらいか。
526デフォルトの名無しさん:2007/08/04(土) 12:03:27
んなこたない。
527デフォルトの名無しさん:2007/08/04(土) 12:10:10
>>523-524
そゆこと。

FileInputStream で1バイト読み込みの read() 連発すると滅茶苦茶遅くなるしね。
528デフォルトの名無しさん:2007/08/04(土) 14:06:31
>>527
チマチマやったとしても、実際問題、OSの方でバッファされてるんじゃないか?
529デフォルトの名無しさん:2007/08/04(土) 14:09:29
いや、JNIの呼び出しコストの話
530デフォルトの名無しさん:2007/08/04(土) 14:14:20
>>525
例外を Java側にスローする際の後始末とかもあるし。
531デフォルトの名無しさん:2007/08/04(土) 14:49:16
>>529 そうだった。
532デフォルトの名無しさん:2007/08/04(土) 14:51:07
といっても、実際問題では2Gのファイル読み込むわけではないし、
むちゃくちゃ遅いって事はないだろ。せいぜいjpegで1,2秒まち。
533デフォルトの名無しさん:2007/08/04(土) 14:56:55
べつにJavaじゃ無くても、ファイル読み込みはネイティブでもそれぐらい時間かかるし。
534デフォルトの名無しさん:2007/08/04(土) 15:03:09
ファイル読み込みが遅いって言ってるんじゃなくて、
JNIの呼び出し回数を増やすと遅くなるって話なんだが。

FileInputStream#read() で 1バイトずつ読み込むのと
FileInputStream#read(byte[]) で 1024バイトずつ読むのとを比べたら
後者の方が圧倒的に速い。
535デフォルトの名無しさん:2007/08/04(土) 15:08:15
ああ、わかってる。
ファイル読み込み(IO)は、Javaのアプリじゃなくて、ネイティブのアプリでやっても、
(1M)は1秒ぐらいかかるから、体感では変わらないってことがいいたかっただけ。

JNIはIOでは仕方なく使うことになるけど、
それよりcodecとかzipとかawtで活躍するんだろうと思う。
536デフォルトの名無しさん:2007/08/04(土) 15:20:24
動画用codecとかawtもハードの機能使ったりする可能性考えるとネイティブにせざるを得ないでしょ。

zipも、ブートストラップクラスローダの初期段階では java.util.zipがロードできてない段階で
zipファイルからclassファイルを読み込む必要を考えると、
ネイティブでzlib相当のライブラリを持って無いとダメっぽい。
537デフォルトの名無しさん:2007/08/04(土) 15:26:41
JavaはCより速いから、IO以外の場所でnativeを使う理由はない。
538デフォルトの名無しさん:2007/08/04(土) 15:28:11
よって全てのライブラリは100% pure javaで作成されるべき。
539デフォルトの名無しさん:2007/08/04(土) 15:47:44
>>536
最近はDRMとかあるから、ハードの機能だけじゃないかもしれんな。
540デフォルトの名無しさん:2007/08/04(土) 17:10:30
JNIはJavaより速いかどうかで使う代物ではないな。
Hack専用。高次元技能者専用。したがってシャア専用。
541デフォルトの名無しさん:2007/08/04(土) 17:16:26
JNIなんて仕方なく使うもんだろ?泥臭さの極致。

 バッドノウハウ

だな。
542デフォルトの名無しさん:2007/08/04(土) 17:21:42
JAMの登場でそうも言ってられなくなるかもな。
jarやdllを埋め込めるようになるから、準標準VMのごとく
仕様を拡張してくる団体が現れても不思議じゃない。
543デフォルトの名無しさん:2007/08/04(土) 22:47:28
>バッドノウハウ
どういう意味?

>JAMの登場でそうも言ってられなくなるかもな
JNIと関係ないと思うけど。
544デフォルトの名無しさん:2007/08/05(日) 00:21:22
むちゃくちゃ関係あるだろ
545デフォルトの名無しさん:2007/08/05(日) 00:55:50
つかadobe airがあるのに頑張る意味あんの?
546デフォルトの名無しさん:2007/08/05(日) 01:02:35
Apollo自体に頑張る意味がないと思うんだが、それよりなぜJNIスレで?
547デフォルトの名無しさん:2007/08/05(日) 08:49:12
>>541 君はJNIを一生障ることはないだろう
548デフォルトの名無しさん:2007/08/05(日) 09:39:57
>>547
仕方なく使うだろ。
549デフォルトの名無しさん:2007/08/05(日) 13:11:00
>>544 いまいちピンと来ない
550デフォルトの名無しさん:2007/08/05(日) 15:52:33
JNIやると、.dllとか.soも理解しないと実質ダメだから敬遠される。
551デフォルトの名無しさん:2007/08/05(日) 19:05:14
敬遠というか、JNIやるときにはDLLとかSO知らないと組めないことをやるわけだから・・・って書こうと思ったけど、DLL作るにしてもVBとかで手軽に書ければいいんだよな
552デフォルトの名無しさん:2007/08/06(月) 08:43:38
mingwのgccでdllつくってる。clとかもそうだけど、コンパイラが吐くエラーメッセージが意味不明で泣きそうになる。javacの出来は優秀ってことが良く分かる。
553デフォルトの名無しさん:2007/08/06(月) 08:58:16
cのリンク時に出るエラーで関数未定義とかで
どこにあるか分からないケースだと泣きそうになるな

javacも的外れなときはあるし
標準以外の機能を使い始めると
classpathが分からなかったり
色々苦労するよ
554デフォルトの名無しさん:2007/08/06(月) 09:49:40
昔、メモリ搭載が128M程度のときに、1/2だと64M、1/4だと32Mなわけで
なんか身近な容量で実感があったけど、今のメモリ搭載が4Gであって、
1/2で2G、1/4で1Gで、メモリ確保としてやってることは変わらない。

2Gのメモリ確保って大きすぎるって感じはするけど、
当時はbmp,jpeg,mp3程度で10Mのファイルだったが、
今では、ISOファイルで700M、DVDで8Gとかのファイル読み込みになるんだから、
2G,3G程度のメモリ確保は普通にやるでしょ。
555デフォルトの名無しさん:2007/08/06(月) 10:46:37
javaプロセス内で2G以上メモリ確保できるかなー
556デフォルトの名無しさん:2007/08/06(月) 12:38:19
当然JavaVM外。
557デフォルトの名無しさん:2007/08/06(月) 13:11:13
同一プロセス内じゃ無理じゃないかな
558デフォルトの名無しさん:2007/08/08(水) 13:54:06
swigでラッパー自動的に吐き出して実装しようとしてるんすが、CStringとLPCTSTRとか、
各ポインタがSWIGTYPE_p_***となってしまってキャスト方法がわからんのですが、
JAVAでsuperclassとか意識しないでキャストする方法ありますか?
559デフォルトの名無しさん:2007/08/09(木) 13:12:53
何をしたいのかよう分からん。
560デフォルトの名無しさん:2007/11/18(日) 03:07:02
>>489
ここで紹介されているものもJNI並のオーバーヘッドがあるのかな?
だれかベンチとった人いないかな?
たとえ内部でJIN使っているとしても、JINとパフォーマンス的に大差ないなら
バッドノウハウなJINを使うよりずっとよさげだ。
561560:2007/11/18(日) 03:08:39
JINって。。。吊(ry
562560:2007/11/18(日) 03:13:34
ついでに
Javaってスタックオーバーフローとかアウトオブメモリとかでもfinallyブロックの実行保障ってされてるの?
563デフォルトの名無しさん:2007/11/18(日) 04:13:29
StackOverflowError や OutOfMemoryError を特別扱いする記述が
JLSには見当たらないから、他の例外と同レベルに保証されてると考えて良いと思うけど。

ただまぁ、finally節で間接的にでもインスタンス生成した場合
即刻 OutOfMemoryError で死ぬって可能性はある。
564デフォルトの名無しさん:2007/11/18(日) 04:27:18
>>563
.NETだとこれらの非同期例外についてfinallyブロックの実行保障がされてなくって
ネイティブリソースを扱う場合はSafeHandle等を使うわけだけども
JNIではVMがよろしくやってくれちゃうって認識でおk?
565デフォルトの名無しさん:2007/11/18(日) 04:36:46
>>564
JNIが何で出てくるのか判らん
>>563はVM内での話でしょ?
566デフォルトの名無しさん:2007/11/18(日) 04:37:07
SafeHandleみたいな場合は、JNI使う側でなんとかしろって事になると思うけど。
っつか、OutOfMemoryError も StackOverflowError も関係ないね、それ。
567デフォルトの名無しさん:2007/11/18(日) 04:49:44
>>566
JNIの呼び出しでJava側がハンドルを受け取ってまたJNIでそのハンドルを引数にして呼び出したり
ってことはないの?
その際、JNIからJavaへ受け渡す合間に非同期例外が発生してもハンドルを喪失しない保障がないとやばいべ
568デフォルトの名無しさん:2007/11/18(日) 11:41:44
>>567
メソッド呼び出しの際にチェックされるから、
JNI呼び出し前に非同期例外が発生していても問題ない。

JNIメソッド内で非同期例外が出る場合ってのも、
例えば OutOfMemoryError が出る前に、
まず NewObject や New<Type>Array みたいなメソッド呼び出し自体が失敗するから、
失敗した時点でJNIメソッド内で責任を持ってハンドルを解放しないといけない。
自動的にはやってくれない。
569デフォルトの名無しさん:2007/11/18(日) 12:04:19
>>566
っつか、SafeHandle みたいな話なら関係ないのは finally だわな。

オブジェクトを生成して戻り値でハンドルを返すようなメソッド内で
オブジェクト生成したのに非同期例外で中断、戻り値じゃなくて例外飛んできて、
生成したオブジェクトのハンドルが失われてるから
finallyブロックの実行が保障されてても、解放したりの後処理ができねーってのを
防ぐための仕組みでしょ、SafeHandle って。
570デフォルトの名無しさん:2007/11/18(日) 12:38:31
すまん。JNIっていうのに興味あるんだけど、ピアソンエデュケーションの本を
立ち読みしてみたんだけど、いまいちよくわからんのだ。JNIっていうのができると
たとえばどんな事ができるんだい?
571デフォルトの名無しさん:2007/11/18(日) 15:19:24
C言語で書かれたライブラリなどがJavaから使えたりします。
572デフォルトの名無しさん:2007/11/18(日) 15:27:10
>>568
なるほど。
JNIメソッド内でハンドル受け渡しを保障して、finally節実行も保証されているなら問題なさげだね。

>>569
SafeHandleはハンドル取得->代入のアトミック性と
SafeHandle自身がクリーンナップコードをもっていてその実行が保障される仕組み
じゃないっけ?だからfinallyが実行されなくてもリソースの開放が保障される。
finally節の実行保障がないからSafeHandleを使うってことで関係ないってことはなくね?
573570:2007/11/18(日) 23:07:02
>>571 サンクス。なら、Windowsフォームつかって無理やりJNIプログラム作ってみるよ。

ありがとね。
574デフォルトの名無しさん:2008/02/29(金) 02:19:26
C -> Java -> C みたいに変な感じでJNIを使いたいんだけど、
Java -> C のための loadLibrary() でDLLが見つからないんだ。

>>462 みたいなエラーが投げられてるみたいなんだ。
java.library.path で指定した場所にあるDLLなのに。

ちなみに、C -> Java の部分をなしにして、直接javaから
起動すると loadLibrary() できるんだ。

あと、sun.boot.library 上に置いてもうまくいくんだ。

JDK1.5.0_10 + Windows XPなんだけど、誰か何か知らない?
575デフォルトの名無しさん:2008/02/29(金) 22:59:06
>>574
それ解決できないレベルが触らない方がいいものだよJNIは
576デフォルトの名無しさん:2008/03/09(日) 01:39:10
JVMTI でツール作ってる。

JNI 部分(A)+Java 部分(B)と、テスト用の Java ター
ゲットプログラム(C)が用意してある。

起動時に指定されたクラスメソッドに対して
RedefineClass() 使って(B)のクラスのスタティックメ
ソッドを呼び出すバイトコードを inject してる。

で、(C) のクラスを指定すると期待通り動くんだけど、
java のライブラリクラスを指定すると (B) クラスの
NoClassDefFoundError になってしまう。

環境は Linux+JDK5 なんだけどこれってどうして?どう
したらいい?

ちなみに Java 歴一年です。
577デフォルトの名無しさん:2008/03/09(日) 01:56:29
どうしても糞もNoClassDefFoundErrorだろ。
今時JNI使おうって奴はこんなレベルなんかね・・・
578576:2008/03/09(日) 01:59:56
>>577
実行環境は全く一緒、実行するプログラムも引数も全く一緒で、
inject してるバイトコードが参照してるクラスも一緒。
ターゲットプログラムのクラスからは見えるのに
ライブラクラスから見えないのはなんで?
579デフォルトの名無しさん:2008/03/09(日) 02:11:02
クラスローダが違うとか?
580576:2008/03/09(日) 02:40:45
了解。ちょっと調べてみる。
581576:2008/03/09(日) 03:49:36
うーん、ちょっと手を入れてる暇がないなぁ。
当初の目的は果たしたし、とりあえずライブラリ側は
どうしても必要なら後から考える。

> 今時JNI使おうって奴はこんなレベルなんかね・・・

いや、これはもう本当にその通り。
JNI なんて触るより前に知っておくべきことだった。
582デフォルトの名無しさん:2008/07/22(火) 19:57:59
 
583デフォルトの名無しさん:2008/07/22(火) 20:38:03
TextSS
584デフォルトの名無しさん:2008/08/13(水) 22:30:08
C++からJavaのnativeなメソッドに char* を返したいのだが、
jbyteArrayとかにしないとJava側で受け取れないかな?
char* のままで返せない?
585デフォルトの名無しさん:2008/08/13(水) 22:53:38
>>584
せめて整数型にキャストするとかしないと無理。
586デフォルトの名無しさん:2008/08/13(水) 23:32:29
>>584
っていうか char* を jbyteArray にどうやって変換するの?
587デフォルトの名無しさん:2008/08/13(水) 23:36:45
NewDirectByteBufferという手も
588デフォルトの名無しさん:2008/08/13(水) 23:58:38
そんなことできるんだ
589デフォルトの名無しさん:2008/08/14(木) 00:01:29
>>587
馬鹿なおいらに具体的なサンプルコード書いてください、仏様。
590デフォルトの名無しさん:2008/08/14(木) 01:26:18
こんな感じ?

#include <jni.h>
JNIEXPORT jobject JNICALL Java_Goodbye_getGoodbye(JNIEnv *env, jclass clazz) {
return (*env)->NewDirectByteBuffer(env, "goodbye", 7);
}

import java.nio.*;
public class Goodbye {
public static void main(String[] args) {
System.loadLibrary("goodbye");
ByteBuffer buffer = getGoodbye();
byte[] b = new byte[buffer.remaining()];
buffer.get(b);
System.out.println(new String(b));
}
private static native ByteBuffer getGoodbye();
}
591デフォルトの名無しさん:2008/08/14(木) 08:30:15
>>590
NewDirectByteBuffer って読み書き両用にしかできないと思ったが、
C/C++ の文字列リテラルって書き込みして良いんだっけか?
592デフォルトの名無しさん:2008/08/14(木) 09:27:52
え、read onlyのdirect bufferって作れないの
593デフォルトの名無しさん:2008/08/14(木) 09:46:01
asReadOnlyBuffer() すりゃ読み込み専用にできるけど、
NewDirectByteBuffer した直後は書き込めるよね。
594デフォルトの名無しさん:2008/08/14(木) 09:51:42
あぁ、asReadOnlyBuffer しても読み込み専用のビュー返すだけで
NewDirectByteBuffer で作成したバッファ自体が読み込み専用になるわけじゃないんで。
595デフォルトの名無しさん:2008/08/14(木) 10:10:12
>>590だけならNewStringとかNewStringUTFした方が楽じゃね

NewDirectByteBufferに自前で確保したメモリ渡す時って
誰がどのタイミングでメモリ解放すりゃいいんだか良くわからんし
メモリ解放用のコールバック関数渡すわけでもないみたいだし
NewDirectByteBufferってメモリマップドI/Oみたいな
解放の必要がないアドレス渡すためにあるんじゃ
596590:2008/08/14(木) 12:11:38
サンプル欲しいっていうから書いただけなんだからねっ
使い方に問題あるのは百も承知

>>595
一度放ったByteBufferを無効に出来ないってのがネックなんだよな
参照が切れてGCに回収されるのをWeakReferenceで待ってから解放するしかない
597デフォルトの名無しさん:2008/08/16(土) 21:24:14
問題の少ない使い方するために記述容易性なくなるんなら
素直に byte[] とか使った方が早いんじゃねーかと思わなくも無い。
598デフォルトの名無しさん:2008/08/17(日) 11:27:03
599デフォルトの名無しさん:2008/09/02(火) 07:29:06
>>596
よく頑張った。参考になった。
600デフォルトの名無しさん:2008/09/13(土) 00:46:19
ああああ デバッグ面倒くせええええ
601デフォルトの名無しさん:2008/10/07(火) 08:19:19
>>401
  ∧ ∧ 彡
ミ ( ^ω^ )っ 彡
  O ノ タタタタ…スゲー
 ミ| (_) 彡
ミ し´ 彡
602デフォルトの名無しさん:2008/11/06(木) 19:01:15
現在とあるマイナーDBMSをJavaから利用するために、DLLで配布された
ドライバをSWIGでラップしてJDBC環境もどきを実現するライブラリを開発
しています。

現在開発環境上ではちゃんと動作するのですが、作成したライブラリを
ドライバのDLLやJNIのDLLと一緒にJARとしてパッケージングして配布
しても、配布先で動作させる事が出来ません。

過去レスではJARにネイティブライブラリを組み込むのは無理、との回答
でしたが、Googleで調べてみるとJARにdllやsoを組み込むには、

「manifest.cfにBundle-NativeCodeなる項目を追加してファイル名を列挙」

すれば良い、みたいな情報を見つけました。が、これでも無理でした。
これはもう無かった事になっているのでしょうか?
603デフォルトの名無しさん:2008/11/06(木) 19:21:33
Bundle- って OSGi では?
普通の Java アプリケーションには無意味なプロパティ
604デフォルトの名無しさん:2008/11/13(木) 00:50:18
JNI で呼び出すDLL(C++でコーディング)で、

int* src = (int *)env->GetPrimitiveArrayCritical()

__m128i * s128 = (__m128i *)src;
__m128i const128 = _mm_set1_epi32(1);
*s128 = _mm_sub_epi32(*s128, const128);


みたいなことするとVMがクラッシュしてくれて泣きそうです。
DLL側でメモリリークしてるとクラッシュするんで、それと同じかなぁと
おもっとるんですが、
GetPrimitiveArrayCritical じゃなくて、普通に
_mm_malloc() して確保した場合は問題ないんですよねぇ。

JNI の先で SIMD 命令使ったことある猛者はおらんですか。
605デフォルトの名無しさん:2008/11/13(木) 02:02:15
クラッシュしたときの例外コードは?

_mm_malloc()で動作するということはalignじゃないの?
606デフォルトの名無しさん:2008/11/24(月) 14:43:19
>>604
どのコードでクラッシュするんだよ?
そのコードの中か?
それとも、そのコード抜けて、しばらくたってからか?

後者なら、おまえの書いたC++コード中か?それとも、JavaVMのコード中か?
607デフォルトの名無しさん:2008/11/24(月) 14:46:17
つか、GetPrimitiveArrayCriticalって、Javaヒープの中身を指してる
ポインタを返すと思うから、下手な操作すると、Javaヒープぶっ壊して
簡単に死ぬぜお
608デフォルトの名無しさん:2009/01/02(金) 03:49:02
SSEなんですけど、DLLが完成してループでテストすると1500回以内だと問題なんですが、それ以上だとするとJVMが落ちます。
mingwでsseなんですが、builtin_addpsのところで落ちてるみたいで、さらに、alinged_mallocつかっても無理でした。
2−3日調べてみましたが解決法はないみたいなんで、面倒だしSIMDについてはIntelにはもう全く期待しないでGPUやOpenGLの方でやります。
せっかくfftとか画像処理で使おうと思ってたんですけど、だれかJNIでSSE使ってる人いないですか?
609デフォルトの名無しさん:2009/01/02(金) 03:54:04
このコアダンプももう見飽きたw

# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x61e012bb, pid=1668, tid=1888
#
# Java VM: Java HotSpot(TM) Client VM (11.0-b15 mixed mode, sharing windows-x86)
# Problematic frame:
# C [sse.dll+0x12bb]

Current thread (0x002b7400): JavaThread "main" [_thread_in_native, id=1888, stack(0x00900000,0x00950000)]

siginfo: ExceptionCode=0xc0000005, reading address 0xffffffff

Registers:
EAX=0x00000000, EBX=0x26947e88, ECX=0x002b7a98, EDX=0x00000004
ESP=0x0094fbb8, EBP=0x0094fc00, ESI=0x0094fc2c, EDI=0x002b7400
EIP=0x61e012bb, EFLAGS=0x00010206

Top of Stack: (sp=0x0094fbb8)
0x0094fbb8: 002b7400 0094fc44 00000000 00000004
0x0094fbc8: 0094fbd8 47012a00 00a06a48 00a06fda
0x0094fbd8: c2040000 c2b00000 c2c60000 41b00000
0x0094fbe8: c7417200 c800f880 c8111580 47012a00
0x0094fbf8: 00989e07 0094fbfc 0094fc38 00a0926b
0x0094fc08: 002b7514 0094fc2c 0094fc24 00000000
0x0094fc18: 00000004 0094fc44 00000000 2298a768
0x0094fc28: 00988069 269483a8 2298a788 00000004

Instructions: (pc=0x61e012bb)
0x61e012ab: 45 08 89 04 24 8b 82 34 03 00 00 ff d0 83 ec 14
0x61e012bb: 0f 28 45 e8 0f 58 45 d8 0f 29 45 e8 8b 45 08 8b
610デフォルトの名無しさん:2009/01/03(土) 13:09:32
sse命令を実行してるところ「だけ」コメントアウトしてみてはいかが
(メモリ確保などはそのままで)

それでも落ちるならsunに通報したほうがいいと思う
611デフォルトの名無しさん:2009/01/03(土) 15:51:08
>>609
sse.dll+0x12bbで落ちてるって出てるんだから、そこ逆アセンブルして解析しろや。
612デフォルトの名無しさん:2009/01/03(土) 23:37:43
sseつかっても結局メインメモリとのIOでアドバンテージも台無しになるから、xmmがfloat*4で8本程度だとあってもなくてもどうでもいいんだろうね。
一応cの方でベンチとってみたけど、fpuとsseでは1.3-1.8倍速くなる程度の開き(movapsつかうsseに有利なやつ)しかなかったから、
特殊な用途でもなんでもないのに、この程度でバグが出るならほっとくかな。
みんなfpuユニットの方使っててjvmでsseユニットを使うって需要がないんだろうな。

>>611
普通の用途でテストしてるのにバグってる(落ちる)ようなものは、残念ですけど使うつもりはありません。
それに、逆アセンブルして解析してバグ取りするのは私の仕事じゃないしw
613デフォルトの名無しさん:2009/01/04(日) 01:34:02
一気にボルテージが上がったな
614デフォルトの名無しさん:2009/01/04(日) 12:21:45
自分の書いたテストプログラムがバグっているのに、それを他人のせいにするキチガイがいるスレはここですか?
615デフォルトの名無しさん:2009/01/04(日) 14:46:27
ソースコードを晒してくれればいじりようがあるんだが
今のままだと彼の妄言と区別しようがない
616デフォルトの名無しさん:2009/01/04(日) 17:36:25
mingwでsseなんでだいぶ資料が少ないからついてこれる人がいるか心配なんですけどw
java側でループのテストして1−1500回のループは通るのですがそれ以降はJVMが落ちて、この[1]から[2]の間でバイオレンスらしいです。
それとjfloat a[4]としてますが、型の宣言方法はいろいろあってそれぞれ試してみたんですけど、どうもbuiltin loadups, addpsの方が問題みたいでした。
addss のスカラー版はループテストは完了していて問題ないです。
まだ敷居が高いですけど、もしsseが使えてライブラリ化できるとjavaで画象処理とかエンコとかストリーム・ライブとかが少しは早くなるんじゃないでしょうか。

JNIEXPORT void JNICALL xxx_Lsse_add_1ps
(JNIEnv *env, jclass clj, jfloatArray dstj, jint ix1, jint cnt, jfloatArray srcj, jint ix2)
{

typedef jfloat v4sf __attribute__ ((vector_size(16))) __attribute__((aligned(16)));

jfloat adst[4],asrc[4];
v4sf d1,s1;

if (cnt<0 || cnt>=5) return;

(*env)->GetFloatArrayRegion(env, dstj, ix1, cnt, adst);
(*env)->GetFloatArrayRegion(env, srcj, ix2, cnt, asrc);

printf(" [1]s%d", global_loop++);
d1=__builtin_ia32_loadups (adst);
s1=__builtin_ia32_loadups (asrc);

printf(" [2]");
d1=__builtin_ia32_addps (d1,s1);
__builtin_ia32_storeups (adst,d1);

printf(" [3]");
(*env)->SetFloatArrayRegion(env, dstj, ix1, cnt, adst);
}
617デフォルトの名無しさん:2009/01/04(日) 18:37:35
関数の仕様が分からないのは置いておくとして、
cntの値として0〜3限定でなく、4がおkというのが気持ち悪くね?
(*env)->GetFloatArrayRegion(〜)の時点でスタック壊れるだろ。caller側がたまたまcnt >= 0 && cnt < 4を保証してたら問題は顕在化しないだろうが。

話題としては逸れるが、このfloat4つ単位でJNI呼び出しちゃうという仕様はコスト掛けすぎ。pure Javaで書いたほうが10倍速いと予想する。
618デフォルトの名無しさん:2009/01/04(日) 18:55:22
Java側のコードも頼む
619デフォルトの名無しさん:2009/01/04(日) 18:58:28
やっぱりついて来れる奴はいないか。
ま、せいぜいWebで資料(英語も)あさりでもしてバグ探してみてよ。
620デフォルトの名無しさん:2009/01/04(日) 19:02:47
>>617
おまえの方が頭バグってんじゃねーの?w
621デフォルトの名無しさん:2009/01/04(日) 22:33:37
負荷試験のコードに向かって「コスト掛けすぎ」とか、なんという言いがかり。

622デフォルトの名無しさん:2009/01/04(日) 23:37:49
なんの負荷はかってんのか、という問題では
623デフォルトの名無しさん:2009/01/04(日) 23:51:05
1500の原因が呼び出し側にある気がするが
呼び出し側のコードがないので
今のままだと彼の妄言と区別しようがない
624デフォルトの名無しさん:2009/01/05(月) 00:07:22
繰り返し呼ぶとJITコンパイラが動くんだけど、その回数がclient vmだと1500回だってさ。

-XX:CompileThreshold

http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

1000回とかにして落ちる回数が変わったらこれかもな。

今回の件にどう絡んでるかわからん。
native method自体はJITコンパイル対象外だし。
スタックポインタの16bytes alignがズレてる可能性はあるかな。

adstやasrcのアドレスをprintfしてみるといいかも。

ま、>>616 にこれが理解できればの話だけど・・・
625デフォルトの名無しさん:2009/01/05(月) 00:49:38
追加

使ってるgcc(mingwってgccだよね)のバージョンは?
こんなんあったぞ
http://gcc.gnu.org/ml/gcc-prs/2003-05/msg00244.html

>>609 の落ちた場所のコードってmovapsじゃなくてmovupsじゃないか?
んでアドレスが16bytes alignされてない気がする
http://ds9a.nl/gcc-simd/example.html
を"0f 28 45 e8"で検索すると例がある

>mingwでsseなんでだいぶ資料が少ないからついてこれる人がいるか心配なんですけどw

この程度でパニクってるお前の低脳さが心配だよw
レベル低過ぎw
626デフォルトの名無しさん:2009/01/05(月) 01:13:27
デバッグご苦労。
627デフォルトの名無しさん:2009/01/05(月) 01:50:17
素直に馬鹿はJNIなんて触るなっていっておけばいい物を・・・やさしいな
628デフォルトの名無しさん:2009/01/05(月) 01:55:00
>>624
gcc (GCC) 3.4.2 (mingw-special)
Copyright (C) 2004 Free Software Foundation, Inc.

gcc のそれは最適化すると勝手にアドレス替えちゃうって言うのじゃなかったか(特にスタックにある位置とasm("")のときも)。
スタックの話が出ると思ってたけど、ヒープ・メモリalligned_malloc(16, sizeof (jfloat)*4)でも
1500回目で落ちるからあまり関係ない感じはする。(1500回以内は正常復帰であることが説明できない)。
そうするとjvm.dllの仕様なのかもな。1500を増やしても解決できるわけではないし、server vmにするわけでもないしなぁ。

それとJava側のコードとか普通に想像できるのしか使ってない。
何ていうか、普通に使うこの程度の用途でこんなバクが出てるんじゃ、Cやコンパイラ仕様に精通してないと全く刃が立たないし、
そもそもJavaから入った奴なんかチンプンカンプンでsimdなんかやる気なくなるだろうwところで、他の人は同じバグでないの?

long nowtime;

float[] fa={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}, fb=new float[fa.length];

nowtime=System.currentTimeMillis();
for (int k=count; k-->0;){
ベクタライズ計算のあれ♪(fa,0,4,fb,0);
}
nowtime=System.currentTimeMillis()-nowtime;
629デフォルトの名無しさん:2009/01/05(月) 02:08:24
未だに>>617みたいな分かてないトウシロもいるから書いておくけど、
JNIは「使うとアプリが速くなる」とか「速くしたいから」JNI使うとか言う代物ではないよ。

SUNの英語サイトでもさんざん書いてあるんだけど、Java/jvmだけでは実現できない機能への「アクセス」が目的で
アプリの速度とか機能の向上が目的なAPIではないよ。
例えばwin32apiとかsse,gpuとかのネイティブ機能を使うには唯一JNIを使うしかないってこと。
dot netだとこのへんもdot net frameworkに組み込んでunsafeとかで実現してるけど(winだけ)、j
vmは同じことをJNIのAPIで実現してる。

それからasmとかじゃないただのネイティブ・アクセスならこっちの方でライブラリ・パッケージ化されてるから、少しは敷居が低くなった。
たぶんwin32apiとか使う人はこれで事足りるんじゃないか?
http://en.wikipedia.org/wiki/Java_Native_Access
630デフォルトの名無しさん:2009/01/05(月) 02:24:48
つまりjvm.dllの仕様とかgccのビルトイン関数の仕様が原因だと、ユーザレベルではどうしようもできないから解決法はない。
それに、この程度の利用方法でバグってるならSIMDは需要すらないってことだとから、人柱になるつもりもないな。
asmを直接使ってasmに神経使うつもりもないし。
C関数_mm_add_psのほうも使ってみるけど、もうIntelのSSEには期待してないからどうでもいいけど。
631デフォルトの名無しさん:2009/01/05(月) 03:05:22
はあ・・・

オプションを1000にしたら落ちるまでの回数も1000になりましたか?

低脳君はこれだから・・・
632デフォルトの名無しさん:2009/01/05(月) 03:10:27
>>627
こういう性分でな。

ま、低脳君のためにやってるわけではないので。
誰か(低脳君を除く)のお役に立てれば幸い。
633デフォルトの名無しさん:2009/01/05(月) 06:41:26
JNIを呼ぶメソッドをHotSpotコンパイラの対象外に設定すればいいだけの話。
634デフォルトの名無しさん:2009/01/05(月) 09:37:02
JNIはもともとHotSpot対象外だよ。何いってのこのオッサン
635デフォルトの名無しさん:2009/01/05(月) 10:03:47
>>633
HotSpotですけど、インタプリタモードで全体のon/offは出来るけどピンポイントでメソッド単位では出来ないでしょ。
それともjava/javacでそういうオプションがあるんですか?
JNI FAQとかhotspot optionsを眺めてみたんですけど、そういうのはないみたいですよ。

一応 -serverでは大丈夫みたいなんで、たぶんhotなコードでHotSpotが効いてるのか、もしくは
FAQにもあったんだんですけどSSE使ってる最中のGC起動でどうとか言うバグ(GCがらみ)と思います。
つまりgccや私のコードでなくjvmのバグってことです。
636デフォルトの名無しさん:2009/01/05(月) 11:59:45
つ.hotspot_compilerファイル
tp://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/crashes.html#gbyzd

>>634
お前みたいな低脳見てるとイライラするわ。一生ロムってろ。
637デフォルトの名無しさん:2009/01/05(月) 12:39:02
おいおい、それ
Note - The .hotspot_compiler file is an unsupported interface. It is documented here solely
for the purposes of troubleshooting and finding a temporary workaround.

とか書いてあるけど、中の人向けでやばいんじゃないの?
ていうかこれ、-XXオプションよりもSUNネイティブじゃんw
もしMSだったらそんな文書はます存在(公表)しないんじゃないのかと思う。「MS仕様です!」とかの域ww
638デフォルトの名無しさん:2009/01/05(月) 13:02:43
RIAにC並みの性能をもたらす次世代のMozilla JavaScriptエンジン
http://www.infoq.com/jp/news/2008/09/tracemonkey

hotspot調べてたらこんな記事があったけどjvmではどうですか?
ざっと読んだところこの手法は、メソッドじゃなくてブロック単位でアスペクト切り替えみたいだけど、たぶん次世代な感じです。

それと .hotspot_compiler 使ってループテストは無事完了しました。
しかしこれではあまりにコアすぎるので他の方法でメソッド単位・クラス単位でJITコンパイル無効とかないですか?

よく考えると、JITコンパイルされようがなんだろうが、コードにバグがあるわけじゃなくてJVMの機構の問題なんで、
このような一時しのぎに頼らざる得ないのはおかしな話ですよね。awt.Canvas::paintとかどうしてるんでしょうか。

native funcやnative asmのret address がgcとかのデータ領域配置換えとかJITネイティブコンパイルによってコードのアドレスが変わって、ret先がずれてるってことなのかなと思う。
もうこのあたりはコアすぎて専門家か職人じゃなきゃ無理でしょ。
639デフォルトの名無しさん:2009/01/05(月) 13:07:16
よってコード領域のアドレス
640デフォルトの名無しさん:2009/01/05(月) 23:02:17
>>625
movupsならalignされてなくても問題ないのでは?

落ちた部分の
0x61e012bb: 0f 28 45 e8 0f 58 45 d8 0f 29 45 e8 8b 45 08 8b
を逆汗すると
MOVAPS XMM0,DQWORD PTR [EBP-18h]
ADDPS XMM0,DQWORD PTR [EBP-28h]
MOVAPS DQWORD PTR [EBP-18h],XMM0

EBPの値は>>609より、0x0094fc00なので、EBP-18h=0x0094fbe8。
ま、どう見ても16byte alignされてないな。
おしまい。
641デフォルトの名無しさん:2009/01/06(火) 06:31:38
>>640
>movupsならalignされてなくても問題ないのでは?

といってみたり、

>ま、どう見ても16byte alignされてないな。

といってみたり、何をいいたいのかどうも良く分からないんだが。

もしかして、「俺ってアセンぶりぶりだぜ!!」ってこと?
642デフォルトの名無しさん:2009/01/08(木) 21:55:10
バカホイホイスレ化してきました。
643デフォルトの名無しさん:2009/01/09(金) 19:25:03
ここだけじゃなくてJava系スレは軒並みそうだけどな
644611:2009/01/16(金) 01:06:01
>>609から、明らかにネイティブコードでアクセス違反起してるのに、JITコンパイル
が云々とか、もうね。

645611:2009/01/16(金) 01:23:15
あ、悪い多分JITコンパイル関係あるわ。
JITコンパイルされて、呼び出し(Java)側のスタックフレームのサイズが変わったんだろ。
んで、インタプリタ実行中はたまたま>>640の言う、EBP-18hが16byteアラインになるEBP(SP)だったってことな。

つまり、>>616のローカル変数(jfloatかv4sf...SSEは素人なんて、どっちかわからん)を、16byteアライン
させれば直るだろ。
Cってアラインを強制する修飾子あるのかな?あるならそれ使って、
ないなら苦肉の策として、16byteのローカル変数突っ込めば、強制アラインされるから、多分直る。

jdouble aaaa; // ←追加
jfloat adst[4],asrc[4];
v4sf d1,s1;

あと利口なコンパイラだと、aaaaの使用点がないと、最適化で消しちゃうから適当な
仕様点作るとか。

646デフォルトの名無しさん:2009/01/23(金) 20:45:33
C++(MFC)で作ったGUIプログラムをEcilpseのプラグインに移植しようとしています。
GUIだけをEclipseで作って、GUI以外は元のプログラムをそのまま使いたいのですが、
プラグインから元のプログラムをJNIで呼ぶのと、ソケット通信で呼ぶのでは
どちらが実装しやすいでしょうか?
647デフォルトの名無しさん:2009/01/23(金) 21:49:29
ソケット通信部分が既に実装済みならソケット通信。
そうでなければ大して手間は変わらんと思う。
648デフォルトの名無しさん:2009/03/14(土) 03:56:14
>>601
648ゲットオォオオォ!!!!!
  ∧∧
  (^ω^)
 cu_uっ バイーン
  彡
 / ̄ ̄\
 | ̄1 ̄|
 | ̄2 ̄|
 ̄ ̄ ̄ ̄ ̄ ̄
649デフォルトの名無しさん:2009/04/07(火) 02:00:47
久しぶりに来たがまだあったのか。息の長ぇスレだな。
650デフォルトの名無しさん:2009/04/07(火) 10:05:03
ある大企業の久しぶりの仕事が
JNI使ったシステムの手直しだった。
全部Javaにすればいいのに。
651デフォルトの名無しさん:2009/04/07(火) 10:50:08
COBOL 使ってたりするとそうも行かんだろう。最後丸めで金額計算とか
やってると精度保証のテストだけでエラい事になるぞ。
652デフォルトの名無しさん:2009/04/07(火) 11:03:56
なぜわかるw
今動いている奴の方が信頼性高いしな。
653デフォルトの名無しさん:2009/04/07(火) 13:35:54
動いてるプログラムと、いまから作るプログラムでは、圧倒的に動いてるプログラムのほうが信頼性高いな。
654デフォルトの名無しさん:2009/04/08(水) 00:53:40
丸ごとシステム入れ替える予算も出ない状況だしな。
JNIで既存システムのライブラリ使って徐々に移行していくしかない。
655デフォルトの名無しさん:2009/04/14(火) 21:20:40
とりあえず JNI で他言語呼ぶにしてもアクセス違反に巻き込まれて Java の
プロセスまで落ちては困るので RMI くらいは噛ませるよう設計している。
あるいはコマンド起動にしてしまうか。

C/C++ も全然平気が売りな SE としてはとにかく JNI は回避されるので
寂しい限りです。
656デフォルトの名無しさん:2009/04/14(火) 23:36:39
RPC経由でもCORBAエラー出まくるだけだと思う。
657デフォルトの名無しさん:2009/04/14(火) 23:57:23
縮退運用やフェールセーフ措置がとれるのでよっぽどマシです。
658デフォルトの名無しさん:2009/04/15(水) 15:41:06
ちゃんと動いてればね。
CORBAエラー出まくって鯖再起動させられる事多いよ。
659デフォルトの名無しさん:2009/04/15(水) 16:24:19
ローカルの Java プロセス間で通信させる程度に IIOP なんか使わないよ。
JNI 使ってる部分を別プロセスに分離できれば良いだけなんだから。
新たにアプリケーションサーバ立てるような大げさな構成考えてない?
660デフォルトの名無しさん:2009/04/15(水) 17:51:57
うちの場合はハードウェア対応とパフォーマンスのためにJNIだから、あんまり関係ないなぁ。
661デフォルトの名無しさん:2009/05/15(金) 08:08:30
>>648
  サテト
  ∧∧
 (・ω・ )
 _| ⊃/(__
/ ヽ-(___/
 ̄ ̄ ̄ ̄ ̄ ̄
662デフォルトの名無しさん:2009/09/21(月) 11:06:08
JNIは何をimportすればいいの?
663デフォルトの名無しさん:2009/09/21(月) 12:23:38
おまえはimportが何なのかわかっていない
importは完全修飾クラス名を書くのが面倒なときにパッケージ名を省略するためのものであって
クラス名をすべて完全修飾で書くのならimport無しでもJavaのすべての機能を使える
664デフォルトの名無しさん:2009/09/21(月) 12:45:15
インポートしても長いのに、まだ長くしようというのか。
嫌いじゃないが。
パス通して相対パスを使うよりも、常に絶対パス使えってことだろうけど。
665デフォルトの名無しさん:2009/09/21(月) 13:16:13
どうせ書くのは宣言だけで、実際使う時は変数名になってるしね

オレはjava.ioとか付いてた方が意味がわかりやすいので、全部書いてるよ
書いてるというか、オートコンプリート機能で一覧から選んでるだけだけど
666デフォルトの名無しさん:2009/09/21(月) 14:10:59
うわぁ…
Java利用者が減ったな
667デフォルトの名無しさん:2009/09/22(火) 18:45:21
JNI使うような場面が減ったんだろう
まあいいことだ
668デフォルトの名無しさん:2009/12/06(日) 23:05:20
JavaのStringは内部的にUTF-16なのに、なぜGetStringUTFCharsはUTF-8なのでしょうか?
これってUTF-16がUTF-8に必ず置き換える文字が存在するのでしょうか?
そうでないと文字落ちが発生すると思うのですが。
669デフォルトの名無しさん:2009/12/06(日) 23:18:43
GetStringCharsという名前の、UTF-16で取得する関数もあるでしょう
便利なように両方用意してあるのです
好きな方を使えばよい
670デフォルトの名無しさん:2010/03/07(日) 05:09:39
java初心者でつ。

ttp://bookend.take-uchi.net/jni2/

ここのページのperlをjni使って呼び出すサンプルを作ってみたけど、
SystemLoadLibrary(myperl);
してるクラスでNoClassDefErrorがでまつ。

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize
class MyPerl
at MyPerlSample1.main(MyPerlSample1.java:25)

staticブロックになってる
SystemLoadLibrary(myperl);

start();/*perlのスタート関数*/
をコメントアウトすると何故か
エラーがでなくなります。

クラスパスやパスを色々いじっても上手く行かず
こんな時間まで徹夜になったorz

誰か親切な方、教えてください。
671670:2010/03/07(日) 05:19:21
開発環境はwindows vistaでjavaはeclipse、
cはbcpadでコンパイラのみvisual c++ 2008、
cファイル、dllファイル、javaファイルともeclipseのプロジェクトのsrc直下に置いて
作業しました。
672デフォルトの名無しさん:2010/03/07(日) 06:53:54
そのページかなり怪しいから別なの探せ
ttp://www.hellohiro.com/native.htm
あと、初心者ならハローワークから始めろ
673670:2010/03/07(日) 10:27:28
>>672

いや俺はJNIがやりたいんじゃなくて、javaからperl呼び出したいんだよ。
ProcessBuilderでできるみたいやけど、
引数受け渡しとか考えたらJNIかなと思ってね。
674デフォルトの名無しさん:2010/03/07(日) 13:57:57
データの受け渡しは標準入出力経由で十分だろう。
グローバル変数共有したいとかいうなら多分設計を考え直した方が良い。
675670:2010/03/07(日) 15:15:59
>>674
標準入出力とはファイルという意味?

白痴でスマソ
676デフォルトの名無しさん:2010/03/07(日) 15:22:14
Perl 側で print した文字が ProcessBuilder の getInputStream() したストリームから読める。
同様に ProcessBuilder の getOutputStream() で取得したストリームに書き込んだものが
Perl 側の scanf(?Perlは知らん) で読める。これに起動パラメータ加えてやれば大抵何とかなる。

Perl 側を標準入力から読み込んで標準出力へ吐くだけのパイプアプリにしろってこと。
677670:2010/03/07(日) 15:34:19
なるほど。
わかりやすい説明ありがと。
複数のパラメータもいけるのかな?
まあ試してみます。
jniは技術的には興味あったが
そっちの方法が良さそうね。
678デフォルトの名無しさん:2010/03/07(日) 21:45:49
jniはjavaの最後の砦
679デフォルトの名無しさん:2010/03/07(日) 22:09:09
最後の砦というよりは使ったら既に負けてる
680デフォルトの名無しさん:2010/03/07(日) 22:13:11
何と戦ってんだ? 俺は目的のために JNI 使うのは全く邪道とは思っとらんが。
681デフォルトの名無しさん:2010/03/08(月) 19:49:40
Perlだったら、javaじゃなくてPerlから直接DLLなりライブラリなり呼べばいい気がするんだが・・・。
Javaよりそういった連携はネットに例もいっぱいありそうだし。

逆にJavaがメイン言語であるなら、Perlで出来そうな時点で、javaで頑張った方が良さそうな感じもするし。

ハード叩くとかの時以外JNIは頭に思い浮かばないなぁ。
682デフォルトの名無しさん:2010/03/09(火) 00:08:17
効率よく出来るなら、積極的にjni使うのも有りだと思うけどね。
最終的にjavaで完結出来れば、javaの世界は広がる訳だし。
わざわざ自分から壁作って選択肢減らしてもメリットは無い。
683デフォルトの名無しさん:2010/03/09(火) 00:30:12
Javaであることに価値があると勘違いしてる開発屋が多いおかげで
JNI 使って客の細かい要望もかなえる俺の付加価値になってるわけだが。
もっと Pure Java 信仰増えてくんねーかなって感じ。
684デフォルトの名無しさん:2010/03/09(火) 12:23:03
メンテの手離れ考えると、俺はJNIは出来るだけ避けるけどなぁ。
どっちともわかる技術者なんてそんないないし。
自社で抱えてる物ならアリとはおもうけどさ。
685デフォルトの名無しさん:2010/03/09(火) 13:13:08
シンプルにやれないことに対して「JNI使えばなんとかなる!」
という方向で話が来る。考え直したほうがいいケースが多い。
686デフォルトの名無しさん:2010/03/09(火) 13:27:30
昔うちでよくあった光景
java部隊「Cだけでやった方がよくないっすか?」
C軍曹「Javaだけでやれよ!」
C軍曹引退したけどさ。
687デフォルトの名無しさん:2010/03/09(火) 13:34:05
昔から謎だったんですけど、java.lang.Math.sin とかのnative 数学関数はやっぱりjniなんですか?
688デフォルトの名無しさん:2010/03/09(火) 15:57:52
java純血廚は宗教掛かってるしな。
泥臭く何でも遣れたほうが使い勝手いいのに。
689デフォルトの名無しさん:2010/03/09(火) 16:47:02
Java で出来る事を JNI 使ってやる奴はアホだが
「Java で出来ないからやるべきではない、考え直した方が良い」とか平気で言うからな。
690デフォルトの名無しさん:2010/03/09(火) 21:35:04
>>687
VM組み込みじゃね
691デフォルトの名無しさん:2010/03/09(火) 22:49:56
組み込みっつうか、API リファレンスにどっかの C ライブラリ使ってると
書いてあるから JNI なんだろ。数値計算ライブラリは実績とパフォーマンスが
第一だから、Java でも書けるといっておいそれと移植する様なことはしない。
692デフォルトの名無しさん:2010/03/09(火) 23:25:58
jvmですか?
128 bits longと複素数型は欲しかったなと思います。
693デフォルトの名無しさん:2010/03/10(水) 00:55:45
>>689
>>684のような理由で避けるのも有りだと思うが。
694デフォルトの名無しさん:2010/03/10(水) 01:13:12
それは流石にヘボすぎるんじゃないの。
695デフォルトの名無しさん:2010/03/10(水) 18:16:53
,net案件やればわかるが、OOも知らないVBしかできないのが巷に溢れてる訳だが・・・
696デフォルトの名無しさん:2010/03/10(水) 22:31:58
× VBしかできない
◯ VBもろくにできない
697デフォルトの名無しさん:2010/03/11(木) 06:16:40
JNIじゃなくてJNAだろ
http://m-ono.info/tech/programming/jna/
698デフォルトの名無しさん:2010/03/11(木) 13:15:18
そのjnaがjniで実装されてるんじゃ。
jni否定する割には、jni使ってるapiを無意識に使いまくってたり。結局jniでjavaから使える様に成ってれば純血javaじゃなくても満足なんじゃ?

javaで出来る事でも、javaだとどうしてもいまいちな事も有るから、jni使うのも有りだと思うけどなあ。純血java主義者は現場を知らな過ぎる。
699デフォルトの名無しさん:2010/03/11(木) 17:36:53
純血主義は単に Java しかできない (個人・会社含めて) 言い訳に使ってるだけだから。
700デフォルトの名無しさん:2010/03/11(木) 21:58:43
ベタベタで良いなら DLL 指定、関数指定で直呼びする汎用の口が一つありゃあ良いだけだけどな。
プリミティブ型 + String, Date あたりの型変換を定義して、あと構造体受け渡しは全部バイト配列で
やるようにすりゃ十分。
701デフォルトの名無しさん:2010/03/11(木) 23:14:38
それJNA
702デフォルトの名無しさん:2010/03/11(木) 23:39:57
つうか JNA って単に JNI の上位ラッパーなだけじゃね。どうせ中って動的プロキシがメソッド名に
対するネイティブ関数呼んでるだけでしょ。
703デフォルトの名無しさん:2010/03/12(金) 01:00:45
単なるラッパーでしかないけど
jar 一個用意したらあとはJavaの世界で片付くのは楽。
別にJNI否定するわけではない。
必要に応じて使い分けたらいい。
704デフォルトの名無しさん:2010/03/12(金) 11:10:21
誰か最近のこの議論まとめろよ。
705デフォルトの名無しさん:2010/03/17(水) 09:16:35
>>487
つnetbeans
706デフォルトの名無しさん:2010/07/30(金) 15:55:25
JNAは簡単にOS独自のAPI呼び出せるから
Javaの利用促進にはつながるだろうね
707デフォルトの名無しさん:2010/09/08(水) 01:19:18
Java + C++/CLI でプログラムを作りたい。
でも、I/F 部分が非常に心配だ。
具体的には、C++/CLI で作った DLL から Java 側に返す値の型だ。
struct や class を返すことができない感じだから、
どうやって大量のまとまったデータを返せばいいのか悩むのだが。
何かいい手はないのだろうか?
708デフォルトの名無しさん:2010/09/08(水) 01:22:31
XML
709デフォルトの名無しさん:2010/09/08(水) 01:23:39
ああ、それがあったか。
サンクス。
710デフォルトの名無しさん:2010/09/08(水) 10:37:52
db経由も有りだと想うけどね。
つーか最初からjavaで作ればいいのに。
711デフォルトの名無しさん:2010/09/08(水) 13:15:30
JNIのスレだよね
712デフォルトの名無しさん:2010/09/08(水) 23:01:18
てか、お前ら情弱すぎwwwわざとか?www
jobjectとかjobjectArrayとかを使えば返せるだろうがwww
jobjectArrayの要素にjobjectArrayとかやれば、大抵のデータは返せるだろwww
ヒントはenvのFindClassとGetMethodIDとNewObjectArrayとNewObjectだwww
713デフォルトの名無しさん:2010/09/08(水) 23:45:58
XMLで返す方が汎用性在る夜
714デフォルトの名無しさん:2010/09/09(木) 00:32:39
>>712
俺、昔それやったとき、Java側でnullになったんだが・・・
C++.netで作ったのって、渡せないかすぐに消えちゃわね?
715デフォルトの名無しさん:2010/09/09(木) 00:56:33
そんなことがありえるのか?
716デフォルトの名無しさん:2010/09/09(木) 01:15:11
nullになるのはなんかミスてんじゃないかと思うが、
.NETのGCとJavaのGCでメモリ共有させんのは面倒そうだとは思う。
717デフォルトの名無しさん:2010/09/09(木) 01:15:45
怒とねとは運用が大変だなあ。
4の新しいの着たからまた健勝だなw
718デフォルトの名無しさん:2010/09/09(木) 06:41:46
Javaで使おうと思ったらゴミ掃除されていた、ってなったら嫌だな
そんな不安定なプログラム、誰も使いたくないだろ
719デフォルトの名無しさん:2010/09/09(木) 06:45:35
おっと、sage忘れたぜ

ま、env経由でnewしたオブジェクトが.net側の管理とは思えないがな
720デフォルトの名無しさん:2010/09/10(金) 07:53:07
ファック!
System::String と jstring の変換がうぜえ!
文字化けしやがる!
721デフォルトの名無しさん:2010/09/10(金) 12:58:57
文字コードまでは自動で返還してくれないんだぜw
ちゃんとutfに自前でコンバートしてjavaとやりとりしないと。
722デフォルトの名無しさん:2010/09/10(金) 15:10:11
こういう時にこそjavaにどれだけ「おんぶにだっこ」だったのか分かる
723デフォルトの名無しさん:2010/09/10(金) 23:00:54
ところでさ、ClassFind とか NewString とかで取得したオブジェクトは、
必ず NULL チェックするべきだよね?
try catch だけじゃ不十分だよね?
724デフォルトの名無しさん:2010/09/10(金) 23:52:47
Javaのヌルポ例外は実際には役に立たないことが多いな
725デフォルトの名無しさん:2010/09/11(土) 12:05:14
env経由でオブジェクト作った直後に全部NULLチェックすればいいじゃん
726デフォルトの名無しさん:2010/09/11(土) 16:28:20
>>720,721
どっちも中身は UTF16 なんだから文字コードの変換なんかいらんだろ。
727デフォルトの名無しさん:2010/09/12(日) 02:43:42
cでファイル読み込むとsjisのままだろ。
javaにそのまま渡しても変換なんてしてくれないよ。
728デフォルトの名無しさん:2010/09/12(日) 16:26:30
android NDKではtry catch使えないの?
729デフォルトの名無しさん:2010/09/13(月) 07:28:27
アンドロイドと聞くと、どうしてもセクサロイドが思い浮かぶんだが
730デフォルトの名無しさん:2010/09/14(火) 07:26:52
なんでわざわさJavaを使うんだ?
全部ネイティブで書けばいいジャマイカ!
731デフォルトの名無しさん:2010/09/15(水) 17:11:43
>>728
try~catchを含む例外機能が使えない。
野良ビルドで例外を使えるようにしたSDKがあるらしいが詳しくは知らない

732デフォルトの名無しさん:2010/09/15(水) 17:17:08
質問があります。
C++の既存の libABC.so というのライブラリがあって、これをJavaから
System.loadLibrary ("ABC");
という名前でアクセスしたいのですが、JNIで作ったバインダー用のライブラリ名
System.loadLibrary ("java-ABC");
でしかアクセスできません。
試しに両者を同じ名前にしたらC++のライブラリを見つけてくれませんでした。
どうしても名前が違うのが気になるのですが、何とかならないでしょうか?


733デフォルトの名無しさん:2010/09/15(水) 17:19:15
void loadLibrary(String name) {
System.loadLibrary("java-" + name);
}
っていうメソッドを作ればいいんじゃない
734デフォルトの名無しさん:2010/09/18(土) 08:58:32
JavaのオブジェクトとC++のオブジェクトが1:1で対応しているとして。
Java ---> C++ は単にJavaのオブジェクトにlong型でC++のポインターを持たせておけばOK
その逆の C++ --> Java がわかりません。
ローカル参照はJNI関数を抜けたら無効化されるので保存しても意味が無い。
グローバル参照を作って保存しておけば良さそうですが、
GCの対象から外れてしまうのでJavaオブジェクトが消えなくなってしまう。
いったいどうすれば???
735デフォルトの名無しさん:2010/09/18(土) 09:21:58
COMを使う
736734:2010/09/19(日) 08:38:40
JavaとC++のオブジェクトを1:1で結びつけたいのですが誰かわかりませんか
737デフォルトの名無しさん:2010/09/20(月) 15:59:36
jniを使えばいい。
738デフォルトの名無しさん:2010/09/21(火) 10:09:48
identityHashCodeは?
739デフォルトの名無しさん:2010/09/21(火) 16:06:00
>GCの対象から外れてしまうのでJavaオブジェクトが消えなくなってしまう
それは問題じゃないんじゃないの?
C++にはGCがないのでどうせ明示的にオブジェクトを削除する必要があるから
デストラクタでグローバル参照を解放させるようにすればいい。
勝手にJava側だけGCされちゃったらそれこそ一対一じゃなくなるじゃん
740デフォルトの名無しさん:2010/09/21(火) 20:57:45
いやそれは良くない。
例えば initialize() でC++のオブジェクトをnewしてグローバル参照を登録して、
C++のデストラクタでグローバル参照を削除するとする。

Javaでインスタンス化した直後にnullで消すと、

CppObject obj = new CppObject ();
obj = null;

このオブジェクトのグローバル参照は永遠に残る。
(C++側でだれもdeleteしてくれないから)



741デフォルトの名無しさん:2010/09/22(水) 02:59:56
そんな事する奴がI/F提供したりJNI使ったりすんなよって話だな
742デフォルトの名無しさん:2010/09/22(水) 07:56:48
>>740
NewWeakGlobalRef
743デフォルトの名無しさん:2010/09/22(水) 09:16:00
そのへんはどこまでjni/java側で面倒見なきゃ逝け無いの?って気もするけどなあ。
744デフォルトの名無しさん:2010/09/22(水) 11:59:44
>>740
そうやってJavaから使うんだったら普通にJava側でC++側のオブジェクトのポインタを持つだけでいいだろ
相互参照を避けるように作ることは可能なはず
>>734が問題になるのはC++側からJavaのオブジェクトを作って使う場合だから>>739で正しい
745デフォルトの名無しさん:2010/09/22(水) 12:43:56
パターンA: Java側からGCによって削除されるケース
CppObject obj = new CppObject ();
obj = null;

パターンB: C++側からdeleteされるケース
CppObject obj = new CppObject ();
World.addObject (obj);   // Worldも中身はC++
World.removeAllObject ();    // C++の中でdelete

CppObjectはJava側とC++側の両方から削除できる必要があるが、意外とこれが難しい。
グローバル参照とポインターを相互に持たせれば1:1の関係を作れるが、
GCの対象にならないのでパターンAが不可能。
というわけでGCの対象にしつつ1:1の関係を作るには>>724の「弱いグローバル参照」を
作れば良いと思うが使ったことが無いのでよくわからない。多分できる。


746デフォルトの名無しさん:2010/09/26(日) 12:25:31
JNIとJNAはどっちが学びやすいですか?
747デフォルトの名無しさん:2010/09/26(日) 21:26:12
そんなことを聞いて待っている暇があったら、
両方やってみた上でどちらが合うのか考えてみるといいよ。
748746:2010/09/26(日) 23:50:35
分かりました。
ttp://d.hatena.ne.jp/ujiujise/20091202/p1
このサイトを見てその通りにやってみたのですが、
C:\jna>java -cp c:\jna\;jna.jar JnaExの部分を実行すると

~/ProjectJNA:java -cp c:\cygwin\home\ユーザー名\ProjectJNA\;jna.jar JnaEx
Exception in thread "main" java.lang.NoClassDefFoundError: JnaEx
Caused by: java.lang.ClassNotFoundException: JnaEx
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: JnaEx. Program will exit.
~/ProjectJNA:java -classpath c:\cygwin\home\ユーザー名\ProjectJNA JnaEx
Exception in thread "main" java.lang.NoClassDefFoundError: JnaEx
Caused by: java.lang.ClassNotFoundException: JnaEx
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: JnaEx. Program will exit.
と表示され駄目です。クラスファイルは確実にあるのは確認しています。
何に原因があるのでしょうか?
749746:2010/09/27(月) 01:03:02
普通にjava JnaExとコマンド打つとプロンプトが帰ってこない状態になります。
750746:2010/09/28(火) 00:15:24
エクリプスだと動作しました!でもなぜかコマンドプロンプトで実行すると

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load librar
y 'JnaEx': ?w???????W??
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:163)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:236)
at com.sun.jna.Library$Handler.<init>(Library.java:140)
at com.sun.jna.Native.loadLibrary(Native.java:379)
at com.sun.jna.Native.loadLibrary(Native.java:364)
at JnaEx$JnaExDLL.<clinit>(JnaEx.java:23)
at JnaEx.main(JnaEx.java:41)

となってしまいました。なぜ?フォルダの中にはきちんとJnaEx.dllがあります。
751デフォルトの名無しさん:2010/10/05(火) 20:07:26
ジェネリクスを使ったList、例えば

private List<Integer> numbers;

をC++側から指定するにはどう書けばいいのでしょうか?
普通のListだとこう書いています。

env->FindClass ("java/util/ArrayList")



752デフォルトの名無しさん:2010/10/05(火) 20:26:12
そのままでいいです
753751:2010/10/05(火) 20:39:00
env->FindClass ("java/util/ArrayList");
env->GetMethodID (textures_class, "add", "(Ljava/lang/Object;)Z");

例えばList.addを呼び出すときの引数の方も普通のObject型で良いんですよね?
上記のコードでたぶん一応動きました。ありがとうございました。

754デフォルトの名無しさん:2010/10/06(水) 11:23:09
ジェネリクスなんてものは実在しません
javacの言葉遊びに過ぎません
755デフォルトの名無しさん:2010/10/09(土) 07:41:03
JNIの代わりに、GIWSって、どうでしょうか?

http://www.scilab.org/products/other/giws

Calling Java from C/C++ can be tricky:
JNI calls are complicated especially when dealing with non primivite types or arrays,
performance issues must be kept in mind all the time and the code can be redundant
(checking exceptions, checking returns of operations...).

Giws is a free software which greatly simplifies the call of Java method/object from C/C++
by generating a C++ wrapper on the Java object.


ちなみに、Scilabは、オープンソースのMatlabみたいなプロジェクト。
行列計算とか信号処理の分野ではお馴染み。
Scilab5から、内部の設計が、CからJavaに変更された。
756デフォルトの名無しさん:2010/10/09(土) 19:01:17
JNIはどちらかというとJavaからC++を呼び出すのに使うが
giwsはC++からJavaを呼び出すのに使えそうだな。
……あまり需要がないような。
scilab作っている所なら物は確かだろうけど自分で使うことはないかなあ
757デフォルトの名無しさん:2010/10/31(日) 17:54:19
JNAeratorを使っている方いますか?
使用法を教えてください
758デフォルトの名無しさん:2010/11/04(木) 20:01:48
テスト
759デフォルトの名無しさん:2010/11/27(土) 08:23:48
age
760デフォルトの名無しさん:2011/02/20(日) 21:14:34.01
age
761デフォルトの名無しさん:2011/03/01(火) 01:05:38.22
誰か、書籍、
JNI:Java Native Interfaceプログラミング―C/C++コードを用いたJavaアプリケーション開発

をやったorやっている人いますでしょうか?
P98の「簡単なクラスローダ」がどうしても実行できません。。。
(JNI若干関係ないんですが。。)

ステップ実行していると、
c = defineClass(name, data, 0, data.length);
内でなぜか勝手に再度、
byte data[] = loadClassData(fileName);
まで飛んで、最終的になぜかjava\lang\Object.classを読もうとして、

java.io.FileNotFoundException: C:\java\lang\Object.class (指定されたパスが見つかりません。)
at java.io.FileInputStream.open(Native Method)
・・・・
at SimpleLoader.loadClass(SimpleLoader.java:44)
at LoaderMain.main(LoaderMain.java:13)

が発生します。誰か実行できたかたおられますでしょうか?
762761:2011/03/02(水) 19:24:39.74
すいません、自己解決しました
763デフォルトの名無しさん:2011/03/03(木) 23:54:32.20
質問!
GUIをnetbeansやwindows builderで作成して実行部分をJNIやJNAで実装できるモン?

またそんな人いる?
764デフォルトの名無しさん:2011/03/26(土) 23:18:36.27
そんなめんどくさい事するマゾが居るのかw
765デフォルトの名無しさん:2011/03/29(火) 13:10:29.16
できるできないでいえばできるだろうけど。
既にCとJavaの資産あって両方活用しないといけないってのでも無い限り、
実行部分も基本Javaでやるか、GUIをC#やDelphiっぽいのでやる方が
楽だと思う。
766デフォルトの名無しさん:2011/03/29(火) 15:00:21.44
JavaでGUIにすると大体Swingだと思うけ当然シングルスレッドだよな?実行部分をマルチタスクにするのってJNIとかでできるもんなの?
767デフォルトの名無しさん:2011/03/29(火) 15:15:29.74
それスレッドとタスクで粒度同じ扱いなんか?
768766:2011/03/29(火) 15:19:55.82
あっ 本当だ書き間違い スレッドの
769デフォルトの名無しさん:2011/03/29(火) 15:26:31.17
プロパティ触ったりするような特定の処理は
EDTでやらなきゃいけないって決まりごとがあるだけで、
それ以外の処理はマルチスレッドで出来るよ。一応JNI経由でもOK。

EDTでないスレッドからJNI経由でWindowの状態を触るネイティブメソッドとか呼ぶと地雷踏む可能性もあるが。
770デフォルトの名無しさん:2011/04/21(木) 18:10:25.15
age
771デフォルトの名無しさん:2011/04/29(金) 14:55:38.31
JNIで値を転送するときパフォーマンスあげるコツある?
char*(C++ MS932) <==> String(Java UTF-8)の変換とか重そうだけど
intとかdoubleはオーバーヘッドすくない?
772デフォルトの名無しさん:2011/04/29(金) 15:40:12.64
JNIはMS932なんかに変換してくれない
UTF-8かUTF-16でしか取り出せないから変換するならJava側でbyte[]にしてから渡すか自前でやるか
渡すデータ量が多いならダイレクトByteBufferも考慮してみてはどうだろうか
773デフォルトの名無しさん:2011/04/29(金) 23:00:37.89
おまえら、JNIのやり方どこで覚えた?
774デフォルトの名無しさん:2011/04/29(金) 23:59:18.61
ソースコード
775デフォルトの名無しさん:2011/04/30(土) 00:27:38.02
>>774
具体的にどこにたくさんある?ググって出てきたの手当たり次第か?
776デフォルトの名無しさん:2011/04/30(土) 01:22:03.39
OpenJDKやHarmonyのランタイムライブラリのJNI部分はどうよ
777デフォルトの名無しさん:2011/04/30(土) 21:43:27.07
>>773
JavaTutorial
778デフォルトの名無しさん:2011/05/01(日) 10:25:17.20
>>777
英語読めるのか?すげーな

俺は全く分からん
779デフォルトの名無しさん:2011/05/01(日) 10:44:03.01
>>772
MS932 <=> UTF16 <=> UTF8 の2段で変換するから重いんですよね。
C++側をUTF16で組めばいいかな。

intとかcharプリミティブの配列も参照渡しできずに値コピーするしかない?
780デフォルトの名無しさん:2011/05/01(日) 10:51:24.76
GetPrimitiveArrayCritical ならコピーせずに済むかもしれないけれど制限が多いので注意が必要
781デフォルトの名無しさん:2011/05/01(日) 23:05:50.65
今やJNAの時代ですよ?
JNIなんて今時使ってんなよw
782デフォルトの名無しさん:2011/05/07(土) 18:48:54.63
>>780
C/C++からJava呼ぶときはそういうのがあるんだね。
JavaからC/C++呼ぶときに同様なものある?
783デフォルトの名無しさん:2011/05/07(土) 19:14:15.06
>>782
NewDirectByteBuffer使ってjava.nio.ByetBufferを受け取る。
どのタイミングでポインタが無効になるかの管理が杜撰だとバグの温床になるけどね。
784デフォルトの名無しさん:2011/05/07(土) 21:19:58.98
逆じゃね
785デフォルトの名無しさん:2011/05/12(木) 15:01:36.76
そもそもプログラムしてる時点でバグやメモリリークを見込んでおくべき。
完璧なアプリにであったこと無いもの。世の中のプログラマの大半はポンコツ。
786デフォルトの名無しさん:2011/05/22(日) 13:53:49.99
JNI、Cで組んでみたんだけどすげー面倒臭い…
ベターC的なノリでC++でやることについてどう思う?
787デフォルトの名無しさん:2011/05/22(日) 13:56:35.97
>>781
CからJVMにアクセスする場合はどうすんの?
788デフォルトの名無しさん:2011/05/22(日) 14:04:49.62
なぜJava狂信者はJavaがC#よりも優れていると言うのか

JNI使ったらJavaのアドバンテージ無いだろ
789デフォルトの名無しさん:2011/05/23(月) 19:15:56.30
jniでc#を下請けに使える。
790デフォルトの名無しさん:2011/05/24(火) 02:24:33.35
そもそもJNIなんて仕方なく使うもんだろ
java、C#優劣論争なんて他所でやれw
791デフォルトの名無しさん:2011/05/24(火) 11:07:14.14
>>788
無料だからじゃない?
792デフォルトの名無しさん:2011/05/28(土) 22:48:42.86
むしろ積極的に使って楽しんでる。
cの世界、javaの世界だけで済ませるのでは選択肢少ないし。
javaで描かれたデバドラやosなんて無いし、cで描かれた移植性の高いアプリも無い。

男だけの会社とか女だけの会社が無いのと同じ。それぞれに剥いた仕事させれバいいじゃないの。バカと挟みは使い用。所詮目的を達成する手段にすぎない。
793デフォルトの名無しさん:2011/05/28(土) 23:02:02.78
にほんごでおk
794デフォルトの名無しさん:2011/05/29(日) 10:30:54.03
やっぱりここの人たちは皆JNI使いか?JNAとか使っている人いるの?JNAeratorとか使いやすくないのか?
795デフォルトの名無しさん:2011/05/31(火) 21:07:45.86
ネイティブのメソッドにJavaのクラスを入れて、メソッド内で削除してメモリ解放したら
ガーベージコレクトは走らないという事なのかな?
796デフォルトの名無しさん:2011/05/31(火) 21:56:02.37
JNI上で作成したオブジェクトは別メモリ管理だからしっかりガベッジコレクタの対象になるとおもうよ
でも、使用方法誤るとEJBみたいにVMが暴走する
797 【東電 63.6 %】 忍法帖【Lv=2,xxxPT】 :2011/06/01(水) 00:56:12.10
そこはそういうもんだな。糊で張り合わせて動かしてるものだし。ウマく動くほうが奇跡的w
ちゃんとメモリ喰い潰しを検出して定期的に再起動かます様な運用で対処してる。原発に津波じゃないけど予め想定しておけば対処方法は有る。
cでもメモリリークしまくってる屑アプリはいくらでもあるし。
798デフォルトの名無しさん:2011/06/01(水) 09:40:00.81
なるほど、JNI側のメモリとJava側のメモリは別々に考える必要があるのですか
ちょっとしたメソッドをネイティブにするくらいなら大丈夫そうだけど、
クラスとか大きいものをネイティ管理するのは大変そうだ
799デフォルトの名無しさん:2011/06/10(金) 01:27:39.63
Java→Native(C言語)の呼び出しで、引数に文字列領域設定して
Native側でそこに文字列設定するのってどうやるんですか?
(Native関数のポインタ渡しみたいなイメージ)
#Native側でのSetObjectArrayElementによる文字列配列渡しなら見つけたんですが。。。
800デフォルトの名無しさん:2011/06/10(金) 07:27:48.32
普通にchar[]とかbyte[]渡して設定して貰うんじゃダメなん?
java.nio.CharBufferとかjava.nio.ByteBufferでもいいけど。
801デフォルトの名無しさん:2011/06/10(金) 23:20:38.51
>>799
配列渡し以外の何を期待してるの?
802デフォルトの名無しさん:2011/06/12(日) 00:25:53.72
そこはjavaとcは別の世界だから、欲しいデータがあれば直接中身をやり取りしないと駄目なんじゃない。
cpuのコアが違って、レジスタ参照が出来ない様な感じ。一旦バス経由で自分の世界に持って来ないと使いにくい。
ハードウェアのnumaみたいな共有メモリで性能を稼ぐ様な実装はまだjniには無いかと。ぐぐってもmmap共有しちゃうような実装は無さそう。
803デフォルトの名無しさん:2011/06/12(日) 00:29:33.62
java.nio.ByteBuffer#allocateDirect()すりゃいいだけだな。
804デフォルトの名無しさん:2011/06/12(日) 04:43:15.17
StringBufferっていう便利なクラスがあるのを知らんのか?
805デフォルトの名無しさん:2011/06/12(日) 16:34:22.96
そのレベルの人が触っちゃいけないもんだがな〜
趣味マが無駄にパフォーマンス気にしてどっかで騙されて来てんのかね?
806デフォルトの名無しさん:2011/06/14(火) 13:52:13.50
Eclipsからさっくりnativeのヘッダ作ったり、JNIのコンパイルする方法って無いでしょうか
807デフォルトの名無しさん:2011/06/15(水) 00:28:40.11
ant使えばできないことはない
808デフォルトの名無しさん:2011/06/15(水) 00:50:21.05
>>804
それ>>799への回答
809デフォルトの名無しさん:2011/06/17(金) 08:41:03.14
できないことはない。ということは鉄板の方法は特にないと言うことですか
やっぱ、ちょっとハードル高いなぁ
810天使 ◆uL5esZLBSE :2011/07/03(日) 05:01:28.09
これ ; デリミタっていうんだけどさ、これをつけなきゃエラーになるような
そんな言語使ってる奴ってどうみてもゴミだと思うんだけど

もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの?
そうか、二度と話かけんなよ

ゴミって意味わかってんのかなこいつら
811デフォルトの名無しさん:2011/07/04(月) 00:40:31.50
これ。句点っていうんだけどさ、これをつけずに文章が成立するような
そんな言語使ってる奴ってどうみてもゴミだと思うんだけど。

もしかして「。」これ打たずに文章の終わりにするのが楽しいの?
そうか、二度と話かけんなよ。

ゴミって意味わかってんのかなこいつら。
812天使 ◆uL5esZLBSE :2011/07/05(火) 06:24:36.31
>>807
∨∨∨∨∨∨∨∨
(((((( ant使えばできないことはない ))))))(きリッッ!!ッッッッ!
∧(キリッッッッ!!!
でもお前はゴミなのにねw
813デフォルトの名無しさん:2011/07/05(火) 18:28:43.58
JavaからC系を呼べるのは良いとして、そのCからJava側のサービスを使いたい時は、手段はあるの?

例えば音を鳴らすAPIがJavaにしかない処理系とかで、C側の処理の途中で音を鳴らしたくなった時とか。
814デフォルトの名無しさん:2011/07/05(火) 20:38:37.15
あるよ
815デフォルトの名無しさん:2011/07/11(月) 00:58:43.30
JNAerator使っているやついる?

便利?
816デフォルトの名無しさん:2011/07/27(水) 18:15:13.68
今日JNIの本を買おうか買うまいか迷ってしまった。古い本ではあるが、

何回も刷られているから良書なのかな?
817デフォルトの名無しさん:2011/07/27(水) 20:20:22.51
買ったらレポよろ
818デフォルトの名無しさん:2011/12/25(日) 03:09:56.89
819デフォルトの名無しさん:2012/04/12(木) 15:12:38.02
過疎ってるな。androidやってる連中が書き込んでるかと思ったが。
820デフォルトの名無しさん:2012/04/12(木) 20:59:36.31
板的に情報書き込みにくる人が少なくなったと思うから、ここも同じく。
821デフォルトの名無しさん:2012/04/21(土) 00:45:54.80
jni自体に語るほどの内容がないよね
単にシェアードライブラリやdllのインターフェース
定義してるだけだし、業務資料作った事あるけど
A4用紙一枚半で十分だった。
822デフォルトの名無しさん:2012/05/22(火) 07:52:46.60
板どころじゃなくてにちゃんごとだな。
にちゃんにくるより他所の無料サイトのほうが詳しい人や中の人そのものが答えてくれたり。
元々オープンソースで誰が作ってるかモロバレだったしユーザ会繋がりも密だったから、わざわざ制限が多くて印象悪い匿名掲示板の価値が消失しちゃってる。
単純に無関係な規制に巻き込まれて、情報提供車が逃げ出しちゃったってのも大きいだろうけど。
若い人ほど、にちゃんから離れて各種snsで満足してるのも学生とかの新規参入が減って過疎高齢化招いてる要素か。
京大の入試問題を知恵袋で聞いてるなんて象徴的だったし。若者ほど、もうにちゃんの存在意義失ってる。


情報というか書き込みがコンテンツなんだから、書き込み減ればにちゃんの価値が下がるのは自明だしな。それを書き込ませない規制で加速させてたらそりゃ氏ぬ輪。

処理自体はjniライブラリを介して伝言ゲームしてるのとな時だしな。
福島原発ー東電ー経産省ー官邸ー総理
と同じ様に
javaのクラスーjnixライブラリーcライブラリ
で伝言ゲームしまくってる。
使い方だけ示せば、あとは呼び出す側のapiやクラスの仕様そのまんまだし。
もう少し進めて、どういう用途か絞り込めれば、包んで呼び出す側のクラスやapiの仕様に合わせてしまって使いやすく用意もできる。

アンドロイドはまだ混沌としすぎてるから、手を出しにくいんじゃない。
nexsus oneとかギャラネクみたいな特定機種で動けばいいだけならばりばりjnixで呼びまくってもいいだろうけど、
逆に国内機種とか搭載アプリの特定ハード向けの作り込みでは、バリバリ多様化されているんじゃない。べつにjniしなくてもcで全部作っちゃってもいいかもしれないけど。
823デフォルトの名無しさん
日本語でおか