1 :
chinkasu :
02/10/05 14:27 このすれ立てても一人としてレスはいるとはおもっちゃ ねーけどさ 2ちゃんのアフォにはこのレス荒らすことぐらいしかできないと 思ってるぜ お前らに期待を裏切るような書き込みをリクエストする
チンカスの仕切るスレなんか育てたくない。
育ててくれなくて結構よ
Java Native Interface プログラミング ピアソン ちょっと誤植あるけどね JNIの資料ってあまりないからage
まあポイントはJava側のクラスメンバと C/C++ネイティブで取り扱う引数とのせめぎあいかな
SWTを参考にすべし
1に2ちゃんのアフォを黙らせるような書き込みをリクエストする
C#並に簡単に書けるようになりませんか? はっきりいってウザイです
>>8 お前みたいな能無しの書き込みをまってたんだよ
どんどん書いてくれ
俺はヴァカだからC#しかできねぇってな
C++からJVMコールしてますがなにか
JavaからC/C++のバイナリをロードするにはJNIを知らないとできません C/C++技術者がJNIを知るとJVMの起動から呼び出しまで自由自在 2ちゃんの方々は言語をやっているだけでperlがうざいだのアセンブラがえらいだの 入り口の部分でのみ優劣を競っている低脳君がほとんどです 大切なのは言語でなにがどこまで深く実現できるかを知ることです
>>12 > 大切なのは言語でなにがどこまで深く実現できるかを知ることです
「だったら、アセンブラがえらいよ。」と言う突込みしかこないぞ。
お前には、簡単にかつ安全に実現できる (=納期迅速、激安) と言う視点はないのか ?
>>12 アセンブラじゃ速くてもコストがあわないぜ
速さとメンテナンス性のバランスを考えた上でのJNIなんだけどな
アセンブラ偉いよ昔のCMOSさんみたいにVzエディタを全部アセンブラで
くむぐらいならな
表面でアセンブラ云々抜かすなよ
おまえもCMOSさんぐらいに組めるのなら尊敬するけどな
>>14 > アセンブラじゃ速くてもコストがあわないぜ
> 速さとメンテナンス性のバランスを考えた上でのJNIなんだけどな
こいつなんか勘違いしてねーか ?
15のような言うだけでアセンブラもCもできない厨房は放置ということで そろそろJNIにいこうか
漏れはlong型のシグネチュアがLでは無い仕様に 結構驚いているけどね
>>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)
で取得するけどね。
23 :
chinkasu :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 がウリなのにそんなことしたら
意味ネーじゃん。馬鹿?
>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との違いが分からん...
>>26 へー、売り物でそんなラッパーがあるですか?
良かったら製品名とか教えてもらえませんか?
>>27 write once run anywhere なんて言ってる人がまだいたんだ…
今、javaに魅力を感じてる開発者って「どこでも動く」ということより
言語仕様、充実してきたクラスライブラリに惹かれてるのではないかと。
40 :
デフォルトの名無しさん :02/10/09 01:09
って、ageてねーよ、俺(鬱
41 :
デフォルトの名無しさん :02/10/09 01:11
JNI使うと遅くなるんだよ 知らないの?
42 :
デフォルトの名無しさん :02/10/09 01:19
JNI通すところ自体はね。
>>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
> 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を切り替えられるよう作成すれば良いのだし
まあこれらを実現するには
多数プラットフォームでコンパイルビルドできてプラットフォームについて
深く知っている必要があるのだけれども
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]
保守
チンカスの仕切るスレなんか育てたくない。
Java Native Interface?
JNI呼び出しがあるとHotSpot最適化等が阻害されるのかなあ?
>>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って知ってる?
>>75 ドキュメントによると
>L fully-qualified-class ; 完全指定のクラス
だそうだ。
例えば "Ljava/lang/String;" とかやるみたい、たぶん。
80 :
Java軍曹 :02/12/27 04:18
まず普通に一本Javaアプリこしらえて、それをその後、ガッツンガッツンのキッリキリに JNIに置き換えて...というか全て中身DLLに挿げ替えて、最終的に static void mainと、 そこから連なる一連のメソッドのインタフェースだけをJavaとして残す。 つーか、エントリ以外ほぼ全てnative宣言。 ....っていう強姦まがいのコードが書きたい。いや、むしろ一度書いてみたい。 write once , run here only.
81 :
Java軍曹 :02/12/27 04:23
ちなみに、当然DLL内ではバージョンの限定されたMFCランタイムや、 何かをインストールしていないと絶対にインストールされないCOMを ギュゥオンギュゥオンに使用。 write once , run now.
write once, debug anywhere
>>80 >最終的に static void mainと
…。
やりたきゃやれば?
GC とか名前による動的バインディングとかの恩恵を
全部 omit するなら Java でやる必要ないし。
84 :
Java軍曹 :02/12/27 05:12
>>83 御意!! まさにおっしゃる通りィッ!!
というより、すでにJavaで無しッッッ!!
>>80 それだったら C言語 のソースをJavaのバイトコードに落とせるコンパイラとか書いた方が面白そう。
86 :
Java軍曹 :02/12/27 05:23
>>85 素晴らしいィィッ!! 隊長ッ!!
全ッ然意味の無いシロモノだが、イイッ!
自分、書いてみたいでありますッ! でも仕事量がマジ半端無ェ勢いに
なりそうで、寝小便しそうでありますッ!
ふつうにCやらC++で書いて、それを、main()だけをエクスポートするdllにして、 javaのmainからキックすればええやん。
88 :
Java軍曹 :02/12/27 08:20
89 :
Java軍曹 :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
103 :
デフォルトの名無しさん :02/12/28 01:34
>>101 前橋和哉さんがそういうコンパイラ作る話題をWebに書いてなかったけ?
>>101 C言語ソース -> Javaソース じゃなくて
C言語ソース -> Javaバイトコード だったら出来るんじゃない?
それに C言語ソース -> Javaソース だったら
可変長引数の処理とかも無理っぽいし。
Cをアセンブリやマシン語には出来ても アセンブリやマシン語をCには出来んでしょ。 Java厨にはそんなこともわからんの?
>>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 食らうし。
114 :
Java軍曹 :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であります!!
115 :
Java軍曹 :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 そこまでコーディングしたなら自分で試せばいいだろ
120 :
Java軍曹 :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
121 :
Java軍曹 :02/12/29 19:26
簡単に言ってしまえば、「COMを使うっぽい感じ」でありますッッ!!
>>120 それだと今回の add を JNI 化しても遅くなる可能性のが高そうだね。
124 :
デフォルトの名無しさん :02/12/31 16:47
>>122 むしろほぼ確実。
最近は、バイトコード実行速度の上昇がめざましいため
JNI呼び出しにかかるオーバヘッドの方が大きくなることが多い
よほど大きなタスクでない限りJavaで完結したほうが速いと思われる。
このスレの趣旨と真っ向から対立する話だけどな。
125 :
Java軍曹 :02/12/31 17:25
>>124 氏
正にッッ!!
JNIを「速度を求めて」あるいは「Javaで利用できない機能」を実現する手段として正しく実装したいと思うなら、
変な言い方かもしれませんが、自分が思うに、
「そのJavaアプリケーションのアドイン的な立場として」実装するのが吉ではないかと思われますッッ!!
つまり、「このnativeなヤツは、最初の引数受け取り以降、あるいは最後の戻り値以前の部分が、結構重い
(あるいはプラットフォーム固有の処理ばっかな)んスよ。」で、かつ
「いや、これはここで完結してるんで、JVMに迷惑かけないスよ」である場合に、
初めてその効能が得られるのではないか、と。
そうで無い場合、124氏の言われるように、Javaで完結するのが、本来は吉であると
思われますッッ!!
nativeインターフェスは速いの〜?(´∀`)
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コードは次の書き込み.
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;を実装するたけでも↑のようなコードが必要っぽい. なんか他にいい方法ないですかね?
>>127 の書き込み訂正
× 100M回
○ 1M回
>>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様がガリガリ最適化したら、 どう書いても同じになりそうな気がするんだが そうでもないのか。
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 アクセスログじゃなくって書き込み単位で記録しているだけだろ
そんな一気にはふえねーだろ
ひろゆきの悲しいときを教えれ。
どうですか。( ´Д⊂
「2chでは裏でIP記録されています。IPを抜かれたくなければ セキュリティガードに…」 というコピペを流行らせる会 会長↓
さて。2ちゃんの流浪の民を吸収できる掲示板システムを作ることが出来得るなら これは非常に大きなビジネスチャンスだと思うのだが。 誰かやれ!
======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 世の中サヨとネットと圧力で出来てると思っているお前のような奴のほうが
世の中にとっては役に立たない
西村氏は 廃人で雪に入って凍っているかと思ったらまだ生きていたんですね。
ちなみに、「国民クイズ」内では日本国憲法が改正され、こんな条文が追加されてる。 日本国憲法第12章104条「国民クイズは国権の最高機関であり、その決定は 国権の最高意思最高法規として、行政、立法、司法、その他あらゆるものに絶対、 無制限に優先する」 笑えるところなのかわからんが34話にはムネオたんか?と思われる方もカメオしてる。
Java Native Interface?
>>481 名誉毀損で逮捕かよ!
でも管理人、笑えないんじゃない?コレ。
>>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記録 告発ネタが減少するのは残念。 ・WTCテロのリーク ・西部の松坂の駐車違反 ・牛肉買い上げの告発 等々、 いろいろとおいしいネタがあったのになあ。 おまえらの知ってる2ちゃん内の告発ネタを教えてください。
良識ある書き込みをしろ
はピン子のAAだったのか(w
国税庁のHP
マスコミって単純だね。 ほんと馬鹿だよな。
正当性を高める必要は全くないな… 知ったかぶりしていた&判決すらちゃんと読んでないな僕は。 まさか弁護士がついてるのに「本件にはプロバイダー責任法が適用され,同法の制定経緯,規制範囲等に照らすと,被告が本件各発言を削除しなかったことにつき削除義務違反はない」と主張するなんて常識的に考えられなかったので… 寝ぼけてたのかな?恥ずかしい(^^; ゴメンナサイ> 231&253
/⌒ヽ / ´_ゝ`) IP子です。よろしこ | / | /| | // | | U .U
>626 ・・・ デンパでしゅか?
いえいえ、誘導どうもありがとうございます。
(^^)
(^^)
>>182 いわゆるJITってクラス境界を越えたinline化はしないのかな?
そうでもしないと限界がすぐに見えちゃう気がするけど。
最近JNIをやってるのですが、JNI Callしたあとって必ず
Exceptionのチェックをしないとダメなんですかね?
かなりウザいんですが・・・
下がりすぎてるようなのでage
186 :
デフォルトの名無しさん :03/01/18 05:08
eclipseでJNIを使ったプロジェクトを開発中ですが、LoadLibrary()で止まってしまいます。 dllはどこに置けばいいのでしょうか。 eclipseスレで聞いたほうがよかったのかな。
確かPATHの通ってるところ
>>185 > Exceptionのチェック
んなわけない
>>188 そうなの?FindClassとかGetMethodIDとかは戻り値が0だったら
エラーが起こってるのは判るけど、
CallObjectMethodとかだと戻り値だけじゃわかんないやん。
で、一度exceptionが起こると、続くJNI呼び出しはおかしくなるようです。
つかjava.exeが固まります(jdk1.4.1)。というわけで
env->CallIntMethod();
check();
env->CallObjectMthod();
check();
...
なんていうコードを書くハメになったりするわけですが、激しくダサい。
>>190 呼び出しが例外を起こす可能性があるなら、
必ずチェックしなければならない。
188は嘘。騙された190はご愁傷さま。
もいっちょお願いします。 .dllをJARに入れて配布するには、どうMANIFESTファイルを設定すればいいでしょうか。
>>193 >.dllをJARに入れて配布するには
無理じゃない?
>>192 必死だと思われようがあえて書く。
185は "JNI Callしたあとって必ず" とあるから
"んなわけない" と書いたんですが。
例外を投げる可能性がある場合に
チェックしないといけないのは当たり前。
voidさんいらっしゃい。
(^^)
>>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ってどういうバージョンなんでしょう
本家には置いてないし・・・
>>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
あげ荒らし氏ね
現在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 じゃなかったっけ?
(^^)
222 :
デフォルトの名無しさん :03/04/19 13:47
結論:全部C++で。これ最強。
∧_∧ ( ^^ )< ぬるぽ(^^)
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
いえいえ、誘導どうもありがとうございます。
/⌒ヽ / ´_ゝ`) IP子です。よろしこ | / | /| | // | | U .U ↑ゲーム製作技術板のなんとか君みたい! ここのマスコットキャラにしよう
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
(^^)
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にすればいいだけではないのか?
間にかませるって言うことだ
(⌒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を叩かなければならないような
仕組みを作る羽目になったときは、つかうど。
「誰だ、この仕組み考えた奴は!」と設計者を呪いながら(ワラ
>>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で。 無理かな?
おかえり
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でスタートアップルーチンだけ用意して。
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とケンカして以来、 大きなものは誰も作ってないと思う
>262 レスありがとうございます。 自分の必要な分はwin32APIを 勉強して、なんとかできました。
swigつかって自分でSDLのラッパー作ってみればどうよ
javahでヘッダが出来るじゃないですか。んで java_パッケージ名_クラス名_関数名(ネイティブメソッド) ってなりますけど、既存の関数呼ぶにはやっぱりこの長い名前の関数から 呼ぶしかないですかね。教えてください。
>>265 swig使ったら自動的に生成してくれますよ
自動で生成って。。。 既存の関数名では出来ないですかね? 調べてみます。
できないから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 ハ__
ヽ ゙二二 ` ,' // 八
ヽ /'´ / ヽ
|ヽ、__, '´ / / \
C単体で動くプログラムはできていて、そのプログラム内で使われている関数をJAVAから呼び出したいと思っています。 C単体で実行はしないのでCのソースのプロトタイプ宣言の部分は削っても問題ないですか? という質問です。
>>281 > C単体で実行はしないのでCのソースのプロトタイプ宣言の部分は削っても問題ないですか?
オマエの手元にしかないソースに判断求められてもねぇ…
基本的に削ると何かメリットがあるのか良く考えてみた方が良いような。
284 :
デフォルトの名無しさん :03/11/08 18:36
Cで適当に作った関数はプロトタイプ宣言をしなくてもJNIで呼び出せたので、別にプロトタイプ宣言なんてしなくてもいいじゃんと思いこんでいるのですが、そんな問題では無いのでしょうか?
おまいらのやっている事VBと同じやん。
>>284 構造体の話はどこいったんだ?
> Cで適当に作った関数はプロトタイプ宣言をしなくてもJNIで呼び出せたので、別にプロトタイプ宣言なんてしなくてもいいじゃんと思いこんでいるのですが、そんな問題では無いのでしょうか?
とりあえず、JNI に関する質問ではないので C の初心者スレにでも言って聞け。
JNIを扱うには、CとJavaとOSに精通してないと厳しいぞ。
>>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になってるならサポート関数があったと思う
すみませんでした。 知ったかぶりしてますた。
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で作った配列には文字変数の指定しかできないため、文字配列を指定して入れる事が難しいのです。 他の方法はありませんか?
>306 ようするにキャラクタ配列をオブジェクト配列に入れたいということ? 型が違うから、char型をCharacterオブジェクト型にしないといけないと思うけど。 JNI使うと、エラー発生時に"このエラーをSUNに報告してくれみたいな"のが出たりして 大変だと思うけど地道に頑張ってください。
ここもネタ心者が出没するよーになったか。 文字列の受け渡しで二週間もハマる馬鹿が実在するとも思えんしなぁ…
すみませんでした。 知ったかぶりしてますた。
>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から呼ぶとダイアログも表示されます。 だれか教えてください。
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のサブクラスを作ってエラーメッセージを固定した。
当初の目的は果たせんだけど、すっきりしない。誰か解決法知らない?
日本語で困ったことはないな。 お前のコードが腐ってるんだろうよ。さらしてみ。
上のサイトの一番下の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するほうが現実的かと。
試した結果、>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引数にして生成する。
あー、わかった。そこでできてるWCHARを WideCharToMultiByteでCP_UTF8のcharにして渡せばいいんだ。
ThrowNewのchar*が食えるのは、なるたけメモリを確保せずにthrowするための 緊急回避なんじゃねえかなあ。
Java側 → Win32dllは、JNIにて実現できる通信ですが、 Win32exe(プロセス) → Java側を実現するには、どのような手段が一番いいですかね? アプリケーション間通信だけできればいいので、できればあまり大げさにはしたくないです。 Win32間でないからパイプは無理だし、一つのOS上での通信なのでソケット通信は少々大げさかなと。
>>344 >Win32間でないからパイプは無理
嘘だろ?
Win32API中のパイプ関連のAPIを全てJNIでラップしたら 使えるんでないの?
>>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
おまえら、SolarisとLinuxプラットフォーム以外の環境で、 native内でシグナルハンドラ使うんじゃねーぞ。
native内でC++例外使うとcatchしているにもかかわらず落ちるバグは 直ったんですかね?(linux)
パッケージを使った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")で エラーが発生しているとコンパイラは怒ってますが原因がわかりません 識者の方々、アドバイスお願いします。
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"); としなければいけないはず。
ありがとうございます。解決しました。 もう一つ質問があるのですが、java側で用意したint型の二次元配列にnative側から値を入れる方法がわかりません。 色々とやってみたんですが、実行時にエラーが出てしまいます。
エラー?
/*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("--------------------------"); } }
/*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); }
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);
372 :
デフォルトの名無しさん :04/10/14 01:11:03
逆ではあるが、それを正したところでC++じゃだめだし。
374 :
デフォルトの名無しさん :04/12/09 00:41:58
JNIでdefineClassメソッドを使ってbyte配列から取得したクラス情報を元に、インスタンスって生成できますか? それにしても、JNIのDefineClassってどうやって使うんだろう・・。
DefineClassってJNIじゃないだろ
376 :
374 :04/12/09 00:55:46
いや、それやりたいのならJNI必要ないだろうという意味だ コアAPIでできるんだから
378 :
374 :04/12/09 07:48:29
>>377 それをネイティブコードでかけるかという質問なんです。
>>378 書けるだろ。
JNIじゃなくてJavaのクラスファイルに関する知識が必要になるだけで。
>>374 がどういった場面でこれを使おうとしているのかわからない・・・
381 :
374 :04/12/09 21:56:27
>>379 Javaオンリーでは実装したことあるのですが、
JNIに移植したとたんセキュリティエラーになりませんか?
382 :
デフォルトの名無しさん :04/12/09 22:58:25
あふぉぅな質問するけどよ JNIって何て読むの?? ジニ?? ジェイエヌアイ 読めなくて"Java Native Interface "って読んでまつ。。
384 :
デフォルトの名無しさん :04/12/11 12:30:12
書いてみた。
386 :
デフォルトの名無しさん :04/12/11 12:52:25
387 :
デフォルトの名無しさん :04/12/13 13:46:25
.netのC#で作った.dllファイルでJNIってできませんか?
>>387 それを言うなら
#NI(シャープニー)だろ?
グぐれ
>>387 .netのC#で作った.dllファイルのメソッドを呼ぶdllを作ればいい
390 :
デフォルトの名無しさん :04/12/18 21:10:34
>>376 JNIインタフェースのDefineClassって、
バージョン毎にシグネチャが異なるのか?
それともヘルプが間違ってるだけなのか?
あと使い方誰か教えてくれ。
何度やってもネイティブコード上でうまくインスタンスを取得できない。
>>391 ……上手くいかない理由がわかったような気がする。
393 :
390 :04/12/18 23:04:05
>>392 教えてくれ!
何が原因なんだ。
つーか、仕様上無理なのか?
つーか、バイトコードを暗号化しても、すぐにやぶられるって。
どうせVMが実行するときにデコードしてるんだからいみないな
397 :
390 :04/12/19 13:40:24
> そこからクラスファイルを生成し、ソース入手可と言っている? 可能。 せいぜい>390がいくら頑張っても、Jad使ってお手軽一発変換、ってのを防ぐ程度の ことしかできんだろう。
そういうこと 苦労してJNIでクラスローダ作ったところでいくらでもいじられるんだし JNIのコードだってスタックサイズの制限とかで大きいの作れないんだから 余裕で解析されるだろうな それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、 毎回ロードするほうがまだ現実的 ネトゲとかでいくらネイティブコードでもbotとかツールとかなくせないわけだしね 安全性のためにJNIってのは意味ない
>>399 > それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
> 毎回ロードするほうがまだ現実的
「まだ現実的」ってのがどういうことを意図しているのかよくわからんが、
JNIでクラスローダ作るのって大した手間じゃないし
ネットワークを意識しなきゃならんほうがいろいろ面倒だと思うがね。
401 :
390 :04/12/20 00:21:26
>>399 > それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
> 毎回ロードするほうがまだ現実的
それこそURLクラスローダクラスをリバースコンパイルされるので、無意味のような気が・・・。
データの暗号化で無く、データを扱うモジュールの暗号化をここでは問題視しているんです。
>>400 >JNIでクラスローダ作るのって大した手間じゃないし
おお!本当ですか?
是非是非ソースレベルで教えてください。
先ほどちょっと妥協して試してみたんですが、
FileInputStreamをJNIで実装しようとしたんですが、
これもやはりうまくいきませんでした・・。
JNI、むずいっす。
クラスが暗号化されようとJREの上で動くときには普通のクラスだろ
たぶん390はVMの中は外から絶対のぞけないと思い込んでいるに一票。
405 :
デフォルトの名無しさん :04/12/21 13:59:21
初歩的な質問かもしれませんが、教えてください。 JavaからJNIを利用して既存のdllにアクセスする場合、オススメの方法はあるでしょうか? 何通りかあるのかもしれませんが...。 「既存のdllは一切変更しない」ことが条件です。 たとえば、間にラッパー(?)をかますとして 「dllを指定し、利用するAPIを選択すると自動でラッパー(またはそのベース部分)を生成してくれるツール」とか...。 Java以外の言語にも精通し、JNIゴリゴリが得意な方は不要かもしれませんが、 「JavaからJNIを利用して既存のdllにアクセスする」を目的とする場合、需要があると思うのですが? よろしくお願いします。
ラッパーつくるしかないよ 大概符号つきをどうするかとかその辺があるわけで
407 :
デフォルトの名無しさん :04/12/23 18:18:03
質問ですが、一般的にJNIといった場合、JVMTI,JVMPI,JVMDI等はその中に含まれると考えていいのでしょうか?
それらすべてともちがうかと JNIといった場合はネイティブコードを呼び出す、もしくはネイティブコードからJVMを呼び出すのが目的だから ってすべて検索すれば詳細出てくるんだが釣り?
知恵を貸して下さい. 現在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 2回目以降の JNI_CreateJavaVM が失敗しているって感じです.
今は手元にコードがないので,後日詳細な報告をします.
>>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 が,
関連するのではないかと思っているのですが間違っていますでしょうか.
エラーコード・・・
>>412 エラーコードを出し惜しみするのは宗教上の理由か?もう答える気なくした。
あーすいませんorz エラーコードは -1 が返ってきているのですが jni.h で確認したところ JNI_ERR (-1) /* unknown error */ ってことは…原因は何なんでしょ.
416 :
デフォルトの名無しさん :05/02/13 23:58:42
DLLからJavaのメソッドって呼べる?
超呼べる。呼びまくり。
>>417 おぉJNIって凄いんだ
それってDLLの中でJVMを作成して?
それともよくあるサンプルみたいにコールバックでって意味で?
どっちがやりたいん? ほとんどの場合はnative methodの実装ですむはずだけど・・・
どっちて言いますか…
EXE→DLL→Javaのメソッドって感じにしたいんです
それで普通にEXEからJavaのメソッドを呼ぶ方法は分かるんです
でもDLLの中でJVMを作成して呼ぶ方法を試していて失敗してるんです
ClassFindって関数で失敗してるんで、クラスパスの設定あたりかもしれないんですけどorz
それで
>>418 の質問をしたんです
どうかDLLの中でJVMを作成して、そこからJavaを呼ぶ方法を教えてください
え、ClassFindのエラーの原因を調べればいいんじゃないの
面白そうなことやってるな
423 :
デフォルトの名無しさん :2005/06/17(金) 17:21:30
NIOっていうかDirectByteBufferを駆使しようぜ
jarファイルをexeに変換するexewrapというツールがある。 これソースを公開してる。JNI使ってVM作ったり、 exe埋め込みリソースからクラスを生成しているようなので 参考になるかもしれんよ。
DirectByteBufferってアレだな X11のshm拡張に似たものがあるな 単なるバイト列をやり取りする需要ってどんなもんだろう 画像とかか?
でもデスクトップ上で扱うタイプなら単純なバイト列というより BufferedImageとかで扱うことが多いもんだから shortやint型配列とかのほうがオーバーヘッドもないし便利
LinuxでJNIで何か処理をすると、StackOverflowErrorが発生するのですが、 何か情報ないでしょうか?
Windowsでも同じく発生するよ スタックはかなり小さくないと動かない模様 Java自体のソースコードを修正してコンパイルしなおしが必要
>>425 ByteBufferからIntBufferやShortBufferに変換できるから無問題
>>428 Windowsで同じソース(ネイティブコードは除く。ただし、処理内容は同じ)を走らせても
StackOverflowError は発生しないのにLinuxでは発生してしまいます。
何が原因なのか調べる手段だけでもアドバイスもらえないでしょうか?
残念ながらJNIのスタックサイズは有効にならないよ
>>430 Java自体のコンパイルってのはVMのことね
J2SE5.0の新しいライセンスでダウンロードしてコンパイルしなおすしかない
>>433 残念ながら、アプリの配布をVMと一緒にという訳にはいかないので
何か違う方法を探してみます。
ちなみに、JNIに関わりの無いところでは、相当量のスタックを使ってもオーバーフローしていません。
>>434 当たり前
Javaのスタックとはまったく別物だし
原因が分かりました。 ネイティブ側のメモリリークに、ガーベッジが重なったときにVMがアボートしていました。 どうりで特定の場所で落ちない訳です。 StackOverflowErrorはVMが異常な状態のときにスローされていたので、 恐らく関数ポインタがズレたせいだと思います。
>>425 亀レスやけど、
DDAとか、memory mapped I/Oとか、
特に組み込みでVRAMなんかに使うんでしょ。
438 :
デフォルトの名無しさん :2005/10/04(火) 15:07:02
DLL から JNI を呼ぶ場合、DestroyJavaVM()は、他にJavaVMを使用中の スレッドが存在すると JavaVM がアンロードできないみたい。 (DestroyJavaVM() で終了まちになる・・・) 強制的に DestroyJavaVM() でJavaVMをアンロードする方法ってあるの?
Cで作ったクラスインスタンスや構造体をJavaに渡すことは可能? Javaで使えなくても、次のDLLの関数呼びに使うために
long値にポインタつっこもうぜ
それでDLL側で作ったメモリの領域が保たれるのか。 CとJava別個に考えてたけど、普通に使えるのね。 やってみる。
保たれはせんだろ。単なるポインタだし。
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で実装されてるんだよね
外部メモリを取るやつがあるからな
449 :
デフォルトの名無しさん :2006/04/09(日) 08:02:11
void getValues(long &x, long &y); のような関数をJNIで呼びたいのですが、 それにはx, y をメンバーに持つオブジェクトを使う しかないのでしょうか?
そう。 あとその質問にJNIは関係ない。
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 をコピーしてるんですが。
> 同じディレクトリに jvm.dll をコピーしてるんですが。 これが原因と見た。
455 :
デフォルトの名無しさん :2006/04/17(月) 13:26:35
>>454 やっぱそうですか・・・
Windows で JNI で遊んでる皆さん、
よかったらJava関連ではどこにPATHを通してるか、
さらしてもらえませんか??
>>452 のように Java アプリから呼び出した
C の関数から、さらに Java のメソッドを
コールバックさせることはできているので、
まったく何もかもがうまくいっていない、
というわけじゃないと思うんです。
息長ぇなこのスレ。
457 :
デフォルトの名無しさん :2006/04/18(火) 00:04:55
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に対応してたっけ?
ネイティブのファイルシステムに置いて無いとダメじゃないのか?
462 :
460 :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の仕組みだからな。
465 :
デフォルトの名無しさん :2006/07/04(火) 21:18:40
時給1000円でJava教えてくださるかたを募集します 場所 所沢(池袋・高田馬場から直通) i−want−to−study−java@hotmail.co.jp (アドレスは全角で書いてあるので半角に直してください) よろしくおねがいします
コンビニのバイトより安いですが、よろしくお願いします。
もち交通費別だよな
468 :
デフォルトの名無しさん :2006/07/05(水) 23:55:10
値段交渉したら、時給上げてくれた
はじめまして,今までJavaしか触ったことがなかったのですが,
470 :
469 :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
です.
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; }
472 :
469 :2006/07/12(水) 14:15:25
>>471 ありがとうございます.早速試してみます.
また何かあったら,書き込むかもしれないのでよろしくお願いします.
473 :
469 :2006/07/12(水) 14:25:36
>>471 連続ですみません.
>ret = WideCharToMultiByte(CP_ACP, 0, jchr, jlen, sjisCode, jlen * 2 + 1, NULL, NULL);
やはりの部分で
>3 番目の引数を 'const jchar *' から 'LPCWSTR' に変換できません。
と出てしまいます.
なにか宣言が抜けたりしているのでしょうか?
474 :
471 :2006/07/12(水) 15:02:49
VisualStudio6.0SP6の環境では問題無くコンパイルして動作しておりましたが、 VC++2005 Expressで駄目な理由は判りかねます…。
475 :
471 :2006/07/12(水) 15:25:57
(LPCWSTR)jchr 明示的にキャストしても駄目でしょうか?
476 :
469 :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を勉強されていて夏休みだけ教えたいという方も歓迎です
> 465-468
479 :
デフォルトの名無しさん :2006/09/05(火) 22:25:34
JNIの勉強をしているのですが,CPU使用率のように連続的にデータを取得する際, Java側からwhileループをまわして何度もdllを読み込むという非効率な方法をとっています. 一度dllを呼び出すだけで連続的に返り値を読み取る方法はあるのでしょうか ご教授お願いします.
>>479 dll読み込む、dll呼び出すってのが、具体的に何を指して言ってるのかわからん。
481 :
479 :2006/09/07(木) 12:53:19
>>480 言葉が足りなくてすみません.
dll読み込む、dll呼び出すというのは,ネイティブメソッドを実行するという意味で書きました.
現在はネイティブメソッド実行時に,返り値としてCPU使用率を取得しているのですが,
この方法ではJava側でWhileループで何度もネイティブメソッドを実行する必要があります.
ネイティブメソッド側でWhileループをつかってJavaに連続的に値を返す方法は
ないのでしょうか
>>481 ネイティブ側では java.nio.ByteBuffer#allocateDirect(int) で得られるバッファに随時書き込んで
Java側はポーリングするだけ、とかならメソッド呼び出しの負荷は減るかもしらん。
ただし、取りこぼしが考えられるので完全な連続性は保証できないし
同期処理とかを考えると取り扱いはかなり面倒になるし、
同期処理は下手すりゃネイティブメソッド呼び出しよりも高くつく可能性もある。
自分の技術力とか、CPU使用率がどれだけ必要なのかとかを良く考えた方が良いかも。
ま、裏技的な事をする前にネイティブメソッド呼び出しが
本当にボトルネックになってるのか検証する事をオススメするけどね。
何の検証もせずに、ネイティブメソッド呼び出しが遅いとか聞きかじった程度なら、
上記みたいな事をしても無駄だと思う。
>>481 dllでOSのスレッド作って、そのスレッドでjvmにアタッチして、
whileループ回しながら、適時、Listener経由でコールバック。
>>483 結局ネイティブ->Javaのメソッド呼び出しのコストが必要になるけどね。
485 :
名無しさん@お腹いっぱい。 :2006/12/07(木) 15:12:29
486 :
デフォルトの名無しさん :2006/12/07(木) 19:57:23
Cで書いたプログラム上でJVMを生成して、クラスをロードしようと思ってるんだけど、 Invocation APIでJVMを作るサンプルができたので、デバッグメッセージをファイルにだそうとしたら、セグメンテーションフォルトで落ちるようになってしまった。 いろいろ削っていって、 FILE* f; ↑この一行があるかないかだけで、セグ(ryが起きるかどうかが変わるんだが、 これどう解決したらいいだろうか?
Java専用のCコンパイラがあったらなとは思う。 ソースコード一式セットしておけば Antみたいのが走ってそのOS向けにビルドとか。 dllとかいちいち作らせるのも忍びない
488 :
デフォルトの名無しさん :2007/04/22(日) 23:55:47
JNIと何が違うの?
>>490 自分で一切ネイティブコード書かなくて良い点が違うんでは?
.NETでいうP/Invokeのようなもんか?
493 :
デフォルトの名無しさん :2007/06/24(日) 11:08:18
すみません。 JavaからFortranのプログラム呼ぶことって可能なのでしょうか? 計算処理はFortranでやってて、それをJavaから呼ぶ必要があるんですが。
ルーチン名がマングリングされないようにコンパイルすれば出来ると思う。 大文字に固定されるとか、末尾にアンダーが入るとかするなら C言語でラッパを書けばいい。
495 :
デフォルトの名無しさん :2007/07/27(金) 18:47:25
Java側からCクラスオブジェクト丸ごと読み込んで、中のメソッド制御したいんですが、 こういう使い方ってJNIで出来るんでしょうか?
エスパー募集中
できる
498 :
デフォルトの名無しさん :2007/07/30(月) 12:01:58
jni使わないと、mmx, sseとか使えないんだね。
jniの呼び出しオーバーヘッドで、mmxとかのメリット吹き飛ぶ予感
それは気にし過ぎ。 2GのファイルとかにMMXするの考えてみて
MMX使っても、メソッド呼び出し1回で 2Gのファイル処理しないとペイしないのか。
比べる土俵が違うんじゃないか。 例えばMMXはJavaにはない機能なんだが、JNI使用しないとつかえないわけで。
いみわからん
java vmのソースも公開されたことだし、jitコンパイラをハックして mmx/sse等を使うようにしてみるのも楽しいかもね!
>>502 >>504 速く処理を終わらせることが目的なのか、MMXを使うことが目的なのか。
大多数の人にとってはMMXは手段であって目的ではない。
JNIの呼び出し、戻しって遅いしね。つかえね〜
MMWなら使った
なんと!
JNIのほうではmemcpy相当 Javaのほうではarraycopy相当 で1000万回やったけど、 native.dllのままで、8秒。 native.dllをcl /02 /GDで最適化して5秒。 arraycopy呼び出しは1秒。 JNIの関数呼び出し戻しって遅いよ。 どうにもならないだろうね。
関数呼び出し戻しの時間を測定するために、ちょっと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は遅すぎ。
ああ、環境は、 windows 2000 jdk 1.6.0.1 cl vc++ 2005
JNIコールが遅いってのは、javaプログラマの常識。 呼び出しそのものが遅いってのもあるけど、JNI関数内がJVMからみて不透明なので、 最適化の阻害要因にもなる。 JNI使うのは、JVM経由ではサポートされないプラットフォーム固有のリソースを使うとか、 画像処理なり数値演算なり、CPUパワーに強く依存する処理を大きな単位でC/C++化したりする ときぐらい。
516 :
デフォルトの名無しさん :2007/08/03(金) 12:55:49
でも呼び戻しが遅いから、その苦労は、相殺される。
>>500 が言うみたいに、2Gとかのファイル処理じゃないと割に合わんね。
518 :
デフォルトの名無しさん :2007/08/03(金) 13:11:32
JVMでは、スクリプトばかりに日がさしているけど、 JNIが日の目を見るのはいつなのか・・
JVM内に取り込めばいいだけの話だろ オープンソースなんだし
JVM内に取り込むって、どーゆー事?
>>517 それだけJavaも進化したものだとつくづく思う
しかし、関数呼び出しがこれほど遅いとはおもわなんだ。 1億回も呼び出すことはないかもしれんが、100万回ぐらいは普通にあるだろ。 in.read()を100万回だと、1Gのファイル処理になるから。
100万で1Mファイルだった。
>>522 GC管理外にオブジェクト持ち出すための準備はJNIでなくても必要になるだろうし、
JITコンパイラがネイティブコードとJavaのコードを混ぜて最適化ってのも期待できないから
仮にJNIなしでネイティブ呼び出ししても、呼び出しコストが高くなるのは変わらんと思うよ。
期待できるのはJNIって名前が変わる事ぐらいか。
んなこたない。
>>523-524 そゆこと。
FileInputStream で1バイト読み込みの read() 連発すると滅茶苦茶遅くなるしね。
>>527 チマチマやったとしても、実際問題、OSの方でバッファされてるんじゃないか?
いや、JNIの呼び出しコストの話
>>525 例外を Java側にスローする際の後始末とかもあるし。
といっても、実際問題では2Gのファイル読み込むわけではないし、 むちゃくちゃ遅いって事はないだろ。せいぜいjpegで1,2秒まち。
べつにJavaじゃ無くても、ファイル読み込みはネイティブでもそれぐらい時間かかるし。
ファイル読み込みが遅いって言ってるんじゃなくて、 JNIの呼び出し回数を増やすと遅くなるって話なんだが。 FileInputStream#read() で 1バイトずつ読み込むのと FileInputStream#read(byte[]) で 1024バイトずつ読むのとを比べたら 後者の方が圧倒的に速い。
ああ、わかってる。 ファイル読み込み(IO)は、Javaのアプリじゃなくて、ネイティブのアプリでやっても、 (1M)は1秒ぐらいかかるから、体感では変わらないってことがいいたかっただけ。 JNIはIOでは仕方なく使うことになるけど、 それよりcodecとかzipとかawtで活躍するんだろうと思う。
動画用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で作成されるべき。
>>536 最近はDRMとかあるから、ハードの機能だけじゃないかもしれんな。
540 :
デフォルトの名無しさん :2007/08/04(土) 17:10:30
JNIはJavaより速いかどうかで使う代物ではないな。 Hack専用。高次元技能者専用。したがってシャア専用。
541 :
デフォルトの名無しさん :2007/08/04(土) 17:16:26
JNIなんて仕方なく使うもんだろ?泥臭さの極致。 バッドノウハウ だな。
JAMの登場でそうも言ってられなくなるかもな。 jarやdllを埋め込めるようになるから、準標準VMのごとく 仕様を拡張してくる団体が現れても不思議じゃない。
>バッドノウハウ どういう意味? >JAMの登場でそうも言ってられなくなるかもな JNIと関係ないと思うけど。
むちゃくちゃ関係あるだろ
つかadobe airがあるのに頑張る意味あんの?
Apollo自体に頑張る意味がないと思うんだが、それよりなぜJNIスレで?
JNIやると、.dllとか.soも理解しないと実質ダメだから敬遠される。
敬遠というか、JNIやるときにはDLLとかSO知らないと組めないことをやるわけだから・・・って書こうと思ったけど、DLL作るにしてもVBとかで手軽に書ければいいんだよな
mingwのgccでdllつくってる。clとかもそうだけど、コンパイラが吐くエラーメッセージが意味不明で泣きそうになる。javacの出来は優秀ってことが良く分かる。
cのリンク時に出るエラーで関数未定義とかで どこにあるか分からないケースだと泣きそうになるな javacも的外れなときはあるし 標準以外の機能を使い始めると classpathが分からなかったり 色々苦労するよ
昔、メモリ搭載が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程度のメモリ確保は普通にやるでしょ。
javaプロセス内で2G以上メモリ確保できるかなー
当然JavaVM外。
同一プロセス内じゃ無理じゃないかな
swigでラッパー自動的に吐き出して実装しようとしてるんすが、CStringとLPCTSTRとか、 各ポインタがSWIGTYPE_p_***となってしまってキャスト方法がわからんのですが、 JAVAでsuperclassとか意識しないでキャストする方法ありますか?
何をしたいのかよう分からん。
>>489 ここで紹介されているものもJNI並のオーバーヘッドがあるのかな?
だれかベンチとった人いないかな?
たとえ内部でJIN使っているとしても、JINとパフォーマンス的に大差ないなら
バッドノウハウなJINを使うよりずっとよさげだ。
561 :
560 :2007/11/18(日) 03:08:39
JINって。。。吊(ry
562 :
560 :2007/11/18(日) 03:13:34
ついでに Javaってスタックオーバーフローとかアウトオブメモリとかでもfinallyブロックの実行保障ってされてるの?
StackOverflowError や OutOfMemoryError を特別扱いする記述が JLSには見当たらないから、他の例外と同レベルに保証されてると考えて良いと思うけど。 ただまぁ、finally節で間接的にでもインスタンス生成した場合 即刻 OutOfMemoryError で死ぬって可能性はある。
>>563 .NETだとこれらの非同期例外についてfinallyブロックの実行保障がされてなくって
ネイティブリソースを扱う場合はSafeHandle等を使うわけだけども
JNIではVMがよろしくやってくれちゃうって認識でおk?
SafeHandleみたいな場合は、JNI使う側でなんとかしろって事になると思うけど。 っつか、OutOfMemoryError も StackOverflowError も関係ないね、それ。
>>566 JNIの呼び出しでJava側がハンドルを受け取ってまたJNIでそのハンドルを引数にして呼び出したり
ってことはないの?
その際、JNIからJavaへ受け渡す合間に非同期例外が発生してもハンドルを喪失しない保障がないとやばいべ
>>567 メソッド呼び出しの際にチェックされるから、
JNI呼び出し前に非同期例外が発生していても問題ない。
JNIメソッド内で非同期例外が出る場合ってのも、
例えば OutOfMemoryError が出る前に、
まず NewObject や New<Type>Array みたいなメソッド呼び出し自体が失敗するから、
失敗した時点でJNIメソッド内で責任を持ってハンドルを解放しないといけない。
自動的にはやってくれない。
>>566 っつか、SafeHandle みたいな話なら関係ないのは finally だわな。
オブジェクトを生成して戻り値でハンドルを返すようなメソッド内で
オブジェクト生成したのに非同期例外で中断、戻り値じゃなくて例外飛んできて、
生成したオブジェクトのハンドルが失われてるから
finallyブロックの実行が保障されてても、解放したりの後処理ができねーってのを
防ぐための仕組みでしょ、SafeHandle って。
570 :
デフォルトの名無しさん :2007/11/18(日) 12:38:31
すまん。JNIっていうのに興味あるんだけど、ピアソンエデュケーションの本を 立ち読みしてみたんだけど、いまいちよくわからんのだ。JNIっていうのができると たとえばどんな事ができるんだい?
C言語で書かれたライブラリなどがJavaから使えたりします。
>>568 なるほど。
JNIメソッド内でハンドル受け渡しを保障して、finally節実行も保証されているなら問題なさげだね。
>>569 SafeHandleはハンドル取得->代入のアトミック性と
SafeHandle自身がクリーンナップコードをもっていてその実行が保障される仕組み
じゃないっけ?だからfinallyが実行されなくてもリソースの開放が保障される。
finally節の実行保障がないからSafeHandleを使うってことで関係ないってことはなくね?
573 :
570 :2007/11/18(日) 23:07:02
>>571 サンクス。なら、Windowsフォームつかって無理やりJNIプログラム作ってみるよ。
ありがとね。
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なんだけど、誰か何か知らない?
>>574 それ解決できないレベルが触らない方がいいものだよJNIは
JVMTI でツール作ってる。 JNI 部分(A)+Java 部分(B)と、テスト用の Java ター ゲットプログラム(C)が用意してある。 起動時に指定されたクラスメソッドに対して RedefineClass() 使って(B)のクラスのスタティックメ ソッドを呼び出すバイトコードを inject してる。 で、(C) のクラスを指定すると期待通り動くんだけど、 java のライブラリクラスを指定すると (B) クラスの NoClassDefFoundError になってしまう。 環境は Linux+JDK5 なんだけどこれってどうして?どう したらいい? ちなみに Java 歴一年です。
どうしても糞もNoClassDefFoundErrorだろ。 今時JNI使おうって奴はこんなレベルなんかね・・・
578 :
576 :2008/03/09(日) 01:59:56
>>577 実行環境は全く一緒、実行するプログラムも引数も全く一緒で、
inject してるバイトコードが参照してるクラスも一緒。
ターゲットプログラムのクラスからは見えるのに
ライブラクラスから見えないのはなんで?
クラスローダが違うとか?
580 :
576 :2008/03/09(日) 02:40:45
了解。ちょっと調べてみる。
581 :
576 :2008/03/09(日) 03:49:36
うーん、ちょっと手を入れてる暇がないなぁ。 当初の目的は果たしたし、とりあえずライブラリ側は どうしても必要なら後から考える。 > 今時JNI使おうって奴はこんなレベルなんかね・・・ いや、これはもう本当にその通り。 JNI なんて触るより前に知っておくべきことだった。
582 :
デフォルトの名無しさん :2008/07/22(火) 19:57:59
583 :
デフォルトの名無しさん :2008/07/22(火) 20:38:03
TextSS
C++からJavaのnativeなメソッドに char* を返したいのだが、 jbyteArrayとかにしないとJava側で受け取れないかな? char* のままで返せない?
>>584 せめて整数型にキャストするとかしないと無理。
>>584 っていうか char* を jbyteArray にどうやって変換するの?
NewDirectByteBufferという手も
そんなことできるんだ
>>587 馬鹿なおいらに具体的なサンプルコード書いてください、仏様。
こんな感じ? #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(); }
>>590 NewDirectByteBuffer って読み書き両用にしかできないと思ったが、
C/C++ の文字列リテラルって書き込みして良いんだっけか?
え、read onlyのdirect bufferって作れないの
asReadOnlyBuffer() すりゃ読み込み専用にできるけど、 NewDirectByteBuffer した直後は書き込めるよね。
あぁ、asReadOnlyBuffer しても読み込み専用のビュー返すだけで NewDirectByteBuffer で作成したバッファ自体が読み込み専用になるわけじゃないんで。
>>590 だけならNewStringとかNewStringUTFした方が楽じゃね
NewDirectByteBufferに自前で確保したメモリ渡す時って
誰がどのタイミングでメモリ解放すりゃいいんだか良くわからんし
メモリ解放用のコールバック関数渡すわけでもないみたいだし
NewDirectByteBufferってメモリマップドI/Oみたいな
解放の必要がないアドレス渡すためにあるんじゃ
596 :
590 :2008/08/14(木) 12:11:38
サンプル欲しいっていうから書いただけなんだからねっ
使い方に問題あるのは百も承知
>>595 一度放ったByteBufferを無効に出来ないってのがネックなんだよな
参照が切れてGCに回収されるのをWeakReferenceで待ってから解放するしかない
問題の少ない使い方するために記述容易性なくなるんなら 素直に byte[] とか使った方が早いんじゃねーかと思わなくも無い。
598 :
デフォルトの名無しさん :2008/08/17(日) 11:27:03
ああああ デバッグ面倒くせええええ
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なる項目を追加してファイル名を列挙」 すれば良い、みたいな情報を見つけました。が、これでも無理でした。 これはもう無かった事になっているのでしょうか?
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 命令使ったことある猛者はおらんですか。
クラッシュしたときの例外コードは? _mm_malloc()で動作するということはalignじゃないの?
606 :
デフォルトの名無しさん :2008/11/24(月) 14:43:19
>>604 どのコードでクラッシュするんだよ?
そのコードの中か?
それとも、そのコード抜けて、しばらくたってからか?
後者なら、おまえの書いたC++コード中か?それとも、JavaVMのコード中か?
607 :
デフォルトの名無しさん :2008/11/24(月) 14:46:17
つか、GetPrimitiveArrayCriticalって、Javaヒープの中身を指してる ポインタを返すと思うから、下手な操作すると、Javaヒープぶっ壊して 簡単に死ぬぜお
SSEなんですけど、DLLが完成してループでテストすると1500回以内だと問題なんですが、それ以上だとするとJVMが落ちます。 mingwでsseなんですが、builtin_addpsのところで落ちてるみたいで、さらに、alinged_mallocつかっても無理でした。 2−3日調べてみましたが解決法はないみたいなんで、面倒だしSIMDについてはIntelにはもう全く期待しないでGPUやOpenGLの方でやります。 せっかくfftとか画像処理で使おうと思ってたんですけど、だれかJNIでSSE使ってる人いないですか?
このコアダンプももう見飽きた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
sse命令を実行してるところ「だけ」コメントアウトしてみてはいかが (メモリ確保などはそのままで) それでも落ちるならsunに通報したほうがいいと思う
611 :
デフォルトの名無しさん :2009/01/03(土) 15:51:08
>>609 sse.dll+0x12bbで落ちてるって出てるんだから、そこ逆アセンブルして解析しろや。
sseつかっても結局メインメモリとのIOでアドバンテージも台無しになるから、xmmがfloat*4で8本程度だとあってもなくてもどうでもいいんだろうね。
一応cの方でベンチとってみたけど、fpuとsseでは1.3-1.8倍速くなる程度の開き(movapsつかうsseに有利なやつ)しかなかったから、
特殊な用途でもなんでもないのに、この程度でバグが出るならほっとくかな。
みんなfpuユニットの方使っててjvmでsseユニットを使うって需要がないんだろうな。
>>611 普通の用途でテストしてるのにバグってる(落ちる)ようなものは、残念ですけど使うつもりはありません。
それに、逆アセンブルして解析してバグ取りするのは私の仕事じゃないしw
一気にボルテージが上がったな
自分の書いたテストプログラムがバグっているのに、それを他人のせいにするキチガイがいるスレはここですか?
ソースコードを晒してくれればいじりようがあるんだが 今のままだと彼の妄言と区別しようがない
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); }
関数の仕様が分からないのは置いておくとして、 cntの値として0〜3限定でなく、4がおkというのが気持ち悪くね? (*env)->GetFloatArrayRegion(〜)の時点でスタック壊れるだろ。caller側がたまたまcnt >= 0 && cnt < 4を保証してたら問題は顕在化しないだろうが。 話題としては逸れるが、このfloat4つ単位でJNI呼び出しちゃうという仕様はコスト掛けすぎ。pure Javaで書いたほうが10倍速いと予想する。
Java側のコードも頼む
やっぱりついて来れる奴はいないか。 ま、せいぜいWebで資料(英語も)あさりでもしてバグ探してみてよ。
620 :
デフォルトの名無しさん :2009/01/04(日) 19:02:47
>>617 おまえの方が頭バグってんじゃねーの?w
621 :
デフォルトの名無しさん :2009/01/04(日) 22:33:37
負荷試験のコードに向かって「コスト掛けすぎ」とか、なんという言いがかり。
なんの負荷はかってんのか、という問題では
1500の原因が呼び出し側にある気がするが 呼び出し側のコードがないので 今のままだと彼の妄言と区別しようがない
デバッグご苦労。
素直に馬鹿はJNIなんて触るなっていっておけばいい物を・・・やさしいな
>>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;
未だに
>>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
つまりjvm.dllの仕様とかgccのビルトイン関数の仕様が原因だと、ユーザレベルではどうしようもできないから解決法はない。 それに、この程度の利用方法でバグってるならSIMDは需要すらないってことだとから、人柱になるつもりもないな。 asmを直接使ってasmに神経使うつもりもないし。 C関数_mm_add_psのほうも使ってみるけど、もうIntelのSSEには期待してないからどうでもいいけど。
はあ・・・ オプションを1000にしたら落ちるまでの回数も1000になりましたか? 低脳君はこれだから・・・
>>627 こういう性分でな。
ま、低脳君のためにやってるわけではないので。
誰か(低脳君を除く)のお役に立てれば幸い。
JNIを呼ぶメソッドをHotSpotコンパイラの対象外に設定すればいいだけの話。
JNIはもともとHotSpot対象外だよ。何いってのこのオッサン
>>633 HotSpotですけど、インタプリタモードで全体のon/offは出来るけどピンポイントでメソッド単位では出来ないでしょ。
それともjava/javacでそういうオプションがあるんですか?
JNI FAQとかhotspot optionsを眺めてみたんですけど、そういうのはないみたいですよ。
一応 -serverでは大丈夫みたいなんで、たぶんhotなコードでHotSpotが効いてるのか、もしくは
FAQにもあったんだんですけどSSE使ってる最中のGC起動でどうとか言うバグ(GCがらみ)と思います。
つまりgccや私のコードでなくjvmのバグってことです。
つ.hotspot_compilerファイル
tp://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/crashes.html#gbyzd
>>634 お前みたいな低脳見てるとイライラするわ。一生ロムってろ。
おいおい、それ 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
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先がずれてるってことなのかなと思う。
もうこのあたりはコアすぎて専門家か職人じゃなきゃ無理でしょ。
よってコード領域のアドレス
>>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されてないな。
おしまい。
>>640 >movupsならalignされてなくても問題ないのでは?
といってみたり、
>ま、どう見ても16byte alignされてないな。
といってみたり、何をいいたいのかどうも良く分からないんだが。
もしかして、「俺ってアセンぶりぶりだぜ!!」ってこと?
バカホイホイスレ化してきました。
ここだけじゃなくてJava系スレは軒並みそうだけどな
644 :
611 :2009/01/16(金) 01:06:01
>>609 から、明らかにネイティブコードでアクセス違反起してるのに、JITコンパイル
が云々とか、もうね。
645 :
611 :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の使用点がないと、最適化で消しちゃうから適当な
仕様点作るとか。
C++(MFC)で作ったGUIプログラムをEcilpseのプラグインに移植しようとしています。 GUIだけをEclipseで作って、GUI以外は元のプログラムをそのまま使いたいのですが、 プラグインから元のプログラムをJNIで呼ぶのと、ソケット通信で呼ぶのでは どちらが実装しやすいでしょうか?
ソケット通信部分が既に実装済みならソケット通信。 そうでなければ大して手間は変わらんと思う。
648 :
デフォルトの名無しさん :2009/03/14(土) 03:56:14
>>601 648ゲットオォオオォ!!!!!
∧∧
(^ω^)
cu_uっ バイーン
彡
/ ̄ ̄\
| ̄1 ̄|
| ̄2 ̄|
 ̄ ̄ ̄ ̄ ̄ ̄
久しぶりに来たがまだあったのか。息の長ぇスレだな。
ある大企業の久しぶりの仕事が JNI使ったシステムの手直しだった。 全部Javaにすればいいのに。
COBOL 使ってたりするとそうも行かんだろう。最後丸めで金額計算とか やってると精度保証のテストだけでエラい事になるぞ。
なぜわかるw 今動いている奴の方が信頼性高いしな。
動いてるプログラムと、いまから作るプログラムでは、圧倒的に動いてるプログラムのほうが信頼性高いな。
丸ごとシステム入れ替える予算も出ない状況だしな。 JNIで既存システムのライブラリ使って徐々に移行していくしかない。
とりあえず JNI で他言語呼ぶにしてもアクセス違反に巻き込まれて Java の プロセスまで落ちては困るので RMI くらいは噛ませるよう設計している。 あるいはコマンド起動にしてしまうか。 C/C++ も全然平気が売りな SE としてはとにかく JNI は回避されるので 寂しい限りです。
RPC経由でもCORBAエラー出まくるだけだと思う。
縮退運用やフェールセーフ措置がとれるのでよっぽどマシです。
ちゃんと動いてればね。 CORBAエラー出まくって鯖再起動させられる事多いよ。
ローカルの Java プロセス間で通信させる程度に IIOP なんか使わないよ。 JNI 使ってる部分を別プロセスに分離できれば良いだけなんだから。 新たにアプリケーションサーバ立てるような大げさな構成考えてない?
うちの場合はハードウェア対応とパフォーマンスのためにJNIだから、あんまり関係ないなぁ。
661 :
デフォルトの名無しさん :2009/05/15(金) 08:08:30
>>648 サテト
∧∧
(・ω・ )
_| ⊃/(__
/ ヽ-(___/
 ̄ ̄ ̄ ̄ ̄ ̄
662 :
デフォルトの名無しさん :2009/09/21(月) 11:06:08
JNIは何をimportすればいいの?
おまえはimportが何なのかわかっていない importは完全修飾クラス名を書くのが面倒なときにパッケージ名を省略するためのものであって クラス名をすべて完全修飾で書くのならimport無しでもJavaのすべての機能を使える
インポートしても長いのに、まだ長くしようというのか。 嫌いじゃないが。 パス通して相対パスを使うよりも、常に絶対パス使えってことだろうけど。
どうせ書くのは宣言だけで、実際使う時は変数名になってるしね オレはjava.ioとか付いてた方が意味がわかりやすいので、全部書いてるよ 書いてるというか、オートコンプリート機能で一覧から選んでるだけだけど
うわぁ… Java利用者が減ったな
JNI使うような場面が減ったんだろう まあいいことだ
668 :
デフォルトの名無しさん :2009/12/06(日) 23:05:20
JavaのStringは内部的にUTF-16なのに、なぜGetStringUTFCharsはUTF-8なのでしょうか? これってUTF-16がUTF-8に必ず置き換える文字が存在するのでしょうか? そうでないと文字落ちが発生すると思うのですが。
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
誰か親切な方、教えてください。
671 :
670 :2010/03/07(日) 05:19:21
開発環境はwindows vistaでjavaはeclipse、 cはbcpadでコンパイラのみvisual c++ 2008、 cファイル、dllファイル、javaファイルともeclipseのプロジェクトのsrc直下に置いて 作業しました。
673 :
670 :2010/03/07(日) 10:27:28
>>672 いや俺はJNIがやりたいんじゃなくて、javaからperl呼び出したいんだよ。
ProcessBuilderでできるみたいやけど、
引数受け渡しとか考えたらJNIかなと思ってね。
データの受け渡しは標準入出力経由で十分だろう。 グローバル変数共有したいとかいうなら多分設計を考え直した方が良い。
675 :
670 :2010/03/07(日) 15:15:59
>>674 標準入出力とはファイルという意味?
白痴でスマソ
Perl 側で print した文字が ProcessBuilder の getInputStream() したストリームから読める。 同様に ProcessBuilder の getOutputStream() で取得したストリームに書き込んだものが Perl 側の scanf(?Perlは知らん) で読める。これに起動パラメータ加えてやれば大抵何とかなる。 Perl 側を標準入力から読み込んで標準出力へ吐くだけのパイプアプリにしろってこと。
677 :
670 :2010/03/07(日) 15:34:19
なるほど。 わかりやすい説明ありがと。 複数のパラメータもいけるのかな? まあ試してみます。 jniは技術的には興味あったが そっちの方法が良さそうね。
jniはjavaの最後の砦
最後の砦というよりは使ったら既に負けてる
何と戦ってんだ? 俺は目的のために JNI 使うのは全く邪道とは思っとらんが。
Perlだったら、javaじゃなくてPerlから直接DLLなりライブラリなり呼べばいい気がするんだが・・・。 Javaよりそういった連携はネットに例もいっぱいありそうだし。 逆にJavaがメイン言語であるなら、Perlで出来そうな時点で、javaで頑張った方が良さそうな感じもするし。 ハード叩くとかの時以外JNIは頭に思い浮かばないなぁ。
効率よく出来るなら、積極的にjni使うのも有りだと思うけどね。 最終的にjavaで完結出来れば、javaの世界は広がる訳だし。 わざわざ自分から壁作って選択肢減らしてもメリットは無い。
Javaであることに価値があると勘違いしてる開発屋が多いおかげで JNI 使って客の細かい要望もかなえる俺の付加価値になってるわけだが。 もっと Pure Java 信仰増えてくんねーかなって感じ。
メンテの手離れ考えると、俺はJNIは出来るだけ避けるけどなぁ。 どっちともわかる技術者なんてそんないないし。 自社で抱えてる物ならアリとはおもうけどさ。
シンプルにやれないことに対して「JNI使えばなんとかなる!」 という方向で話が来る。考え直したほうがいいケースが多い。
昔うちでよくあった光景 java部隊「Cだけでやった方がよくないっすか?」 C軍曹「Javaだけでやれよ!」 C軍曹引退したけどさ。
昔から謎だったんですけど、java.lang.Math.sin とかのnative 数学関数はやっぱりjniなんですか?
java純血廚は宗教掛かってるしな。 泥臭く何でも遣れたほうが使い勝手いいのに。
Java で出来る事を JNI 使ってやる奴はアホだが 「Java で出来ないからやるべきではない、考え直した方が良い」とか平気で言うからな。
組み込みっつうか、API リファレンスにどっかの C ライブラリ使ってると 書いてあるから JNI なんだろ。数値計算ライブラリは実績とパフォーマンスが 第一だから、Java でも書けるといっておいそれと移植する様なことはしない。
jvmですか? 128 bits longと複素数型は欲しかったなと思います。
それは流石にヘボすぎるんじゃないの。
,net案件やればわかるが、OOも知らないVBしかできないのが巷に溢れてる訳だが・・・
× VBしかできない ◯ VBもろくにできない
そのjnaがjniで実装されてるんじゃ。 jni否定する割には、jni使ってるapiを無意識に使いまくってたり。結局jniでjavaから使える様に成ってれば純血javaじゃなくても満足なんじゃ? javaで出来る事でも、javaだとどうしてもいまいちな事も有るから、jni使うのも有りだと思うけどなあ。純血java主義者は現場を知らな過ぎる。
純血主義は単に Java しかできない (個人・会社含めて) 言い訳に使ってるだけだから。
ベタベタで良いなら DLL 指定、関数指定で直呼びする汎用の口が一つありゃあ良いだけだけどな。 プリミティブ型 + String, Date あたりの型変換を定義して、あと構造体受け渡しは全部バイト配列で やるようにすりゃ十分。
それJNA
つうか JNA って単に JNI の上位ラッパーなだけじゃね。どうせ中って動的プロキシがメソッド名に 対するネイティブ関数呼んでるだけでしょ。
単なるラッパーでしかないけど jar 一個用意したらあとはJavaの世界で片付くのは楽。 別にJNI否定するわけではない。 必要に応じて使い分けたらいい。
誰か最近のこの議論まとめろよ。
JNAは簡単にOS独自のAPI呼び出せるから Javaの利用促進にはつながるだろうね
707 :
デフォルトの名無しさん :2010/09/08(水) 01:19:18
Java + C++/CLI でプログラムを作りたい。 でも、I/F 部分が非常に心配だ。 具体的には、C++/CLI で作った DLL から Java 側に返す値の型だ。 struct や class を返すことができない感じだから、 どうやって大量のまとまったデータを返せばいいのか悩むのだが。 何かいい手はないのだろうか?
XML
ああ、それがあったか。 サンクス。
db経由も有りだと想うけどね。 つーか最初からjavaで作ればいいのに。
JNIのスレだよね
てか、お前ら情弱すぎwwwわざとか?www jobjectとかjobjectArrayとかを使えば返せるだろうがwww jobjectArrayの要素にjobjectArrayとかやれば、大抵のデータは返せるだろwww ヒントはenvのFindClassとGetMethodIDとNewObjectArrayとNewObjectだwww
XMLで返す方が汎用性在る夜
>>712 俺、昔それやったとき、Java側でnullになったんだが・・・
C++.netで作ったのって、渡せないかすぐに消えちゃわね?
715 :
デフォルトの名無しさん :2010/09/09(木) 00:56:33
そんなことがありえるのか?
nullになるのはなんかミスてんじゃないかと思うが、 .NETのGCとJavaのGCでメモリ共有させんのは面倒そうだとは思う。
怒とねとは運用が大変だなあ。 4の新しいの着たからまた健勝だなw
718 :
デフォルトの名無しさん :2010/09/09(木) 06:41:46
Javaで使おうと思ったらゴミ掃除されていた、ってなったら嫌だな そんな不安定なプログラム、誰も使いたくないだろ
おっと、sage忘れたぜ ま、env経由でnewしたオブジェクトが.net側の管理とは思えないがな
720 :
デフォルトの名無しさん :2010/09/10(金) 07:53:07
ファック! System::String と jstring の変換がうぜえ! 文字化けしやがる!
文字コードまでは自動で返還してくれないんだぜw ちゃんとutfに自前でコンバートしてjavaとやりとりしないと。
こういう時にこそjavaにどれだけ「おんぶにだっこ」だったのか分かる
ところでさ、ClassFind とか NewString とかで取得したオブジェクトは、 必ず NULL チェックするべきだよね? try catch だけじゃ不十分だよね?
Javaのヌルポ例外は実際には役に立たないことが多いな
env経由でオブジェクト作った直後に全部NULLチェックすればいいじゃん
>>720 ,721
どっちも中身は UTF16 なんだから文字コードの変換なんかいらんだろ。
cでファイル読み込むとsjisのままだろ。 javaにそのまま渡しても変換なんてしてくれないよ。
android NDKではtry catch使えないの?
アンドロイドと聞くと、どうしてもセクサロイドが思い浮かぶんだが
なんでわざわさJavaを使うんだ? 全部ネイティブで書けばいいジャマイカ!
>>728 try~catchを含む例外機能が使えない。
野良ビルドで例外を使えるようにしたSDKがあるらしいが詳しくは知らない
質問があります。 C++の既存の libABC.so というのライブラリがあって、これをJavaから System.loadLibrary ("ABC"); という名前でアクセスしたいのですが、JNIで作ったバインダー用のライブラリ名 System.loadLibrary ("java-ABC"); でしかアクセスできません。 試しに両者を同じ名前にしたらC++のライブラリを見つけてくれませんでした。 どうしても名前が違うのが気になるのですが、何とかならないでしょうか?
void loadLibrary(String name) { System.loadLibrary("java-" + name); } っていうメソッドを作ればいいんじゃない
JavaのオブジェクトとC++のオブジェクトが1:1で対応しているとして。 Java ---> C++ は単にJavaのオブジェクトにlong型でC++のポインターを持たせておけばOK その逆の C++ --> Java がわかりません。 ローカル参照はJNI関数を抜けたら無効化されるので保存しても意味が無い。 グローバル参照を作って保存しておけば良さそうですが、 GCの対象から外れてしまうのでJavaオブジェクトが消えなくなってしまう。 いったいどうすれば???
COMを使う
736 :
734 :2010/09/19(日) 08:38:40
JavaとC++のオブジェクトを1:1で結びつけたいのですが誰かわかりませんか
jniを使えばいい。
identityHashCodeは?
>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してくれないから)
そんな事する奴がI/F提供したりJNI使ったりすんなよって話だな
そのへんはどこまでjni/java側で面倒見なきゃ逝け無いの?って気もするけどなあ。
>>740 そうやってJavaから使うんだったら普通にJava側でC++側のオブジェクトのポインタを持つだけでいいだろ
相互参照を避けるように作ることは可能なはず
>>734 が問題になるのはC++側からJavaのオブジェクトを作って使う場合だから
>>739 で正しい
パターン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はどっちが学びやすいですか?
そんなことを聞いて待っている暇があったら、 両方やってみた上でどちらが合うのか考えてみるといいよ。
748 :
746 :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.
と表示され駄目です。クラスファイルは確実にあるのは確認しています。
何に原因があるのでしょうか?
749 :
746 :2010/09/27(月) 01:03:02
普通にjava JnaExとコマンド打つとプロンプトが帰ってこない状態になります。
750 :
746 :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")
そのままでいいです
753 :
751 :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に変更された。
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) が発生します。誰か実行できたかたおられますでしょうか?
762 :
761 :2011/03/02(水) 19:24:39.74
すいません、自己解決しました
763 :
デフォルトの名無しさん :2011/03/03(木) 23:54:32.20
質問! GUIをnetbeansやwindows builderで作成して実行部分をJNIやJNAで実装できるモン? またそんな人いる?
そんなめんどくさい事するマゾが居るのかw
できるできないでいえばできるだろうけど。 既にCとJavaの資産あって両方活用しないといけないってのでも無い限り、 実行部分も基本Javaでやるか、GUIをC#やDelphiっぽいのでやる方が 楽だと思う。
766 :
デフォルトの名無しさん :2011/03/29(火) 15:00:21.44
JavaでGUIにすると大体Swingだと思うけ当然シングルスレッドだよな?実行部分をマルチタスクにするのってJNIとかでできるもんなの?
それスレッドとタスクで粒度同じ扱いなんか?
768 :
766 :2011/03/29(火) 15:19:55.82
あっ 本当だ書き間違い スレッドの
プロパティ触ったりするような特定の処理は EDTでやらなきゃいけないって決まりごとがあるだけで、 それ以外の処理はマルチスレッドで出来るよ。一応JNI経由でもOK。 EDTでないスレッドからJNI経由でWindowの状態を触るネイティブメソッドとか呼ぶと地雷踏む可能性もあるが。
770 :
デフォルトの名無しさん :2011/04/21(木) 18:10:25.15
age
JNIで値を転送するときパフォーマンスあげるコツある? char*(C++ MS932) <==> String(Java UTF-8)の変換とか重そうだけど intとかdoubleはオーバーヘッドすくない?
JNIはMS932なんかに変換してくれない UTF-8かUTF-16でしか取り出せないから変換するならJava側でbyte[]にしてから渡すか自前でやるか 渡すデータ量が多いならダイレクトByteBufferも考慮してみてはどうだろうか
773 :
デフォルトの名無しさん :2011/04/29(金) 23:00:37.89
おまえら、JNIのやり方どこで覚えた?
ソースコード
775 :
デフォルトの名無しさん :2011/04/30(土) 00:27:38.02
>>774 具体的にどこにたくさんある?ググって出てきたの手当たり次第か?
OpenJDKやHarmonyのランタイムライブラリのJNI部分はどうよ
778 :
デフォルトの名無しさん :2011/05/01(日) 10:25:17.20
>>777 英語読めるのか?すげーな
俺は全く分からん
>>772 MS932 <=> UTF16 <=> UTF8 の2段で変換するから重いんですよね。
C++側をUTF16で組めばいいかな。
intとかcharプリミティブの配列も参照渡しできずに値コピーするしかない?
GetPrimitiveArrayCritical ならコピーせずに済むかもしれないけれど制限が多いので注意が必要
今やJNAの時代ですよ? JNIなんて今時使ってんなよw
>>780 C/C++からJava呼ぶときはそういうのがあるんだね。
JavaからC/C++呼ぶときに同様なものある?
>>782 NewDirectByteBuffer使ってjava.nio.ByetBufferを受け取る。
どのタイミングでポインタが無効になるかの管理が杜撰だとバグの温床になるけどね。
逆じゃね
そもそもプログラムしてる時点でバグやメモリリークを見込んでおくべき。 完璧なアプリにであったこと無いもの。世の中のプログラマの大半はポンコツ。
786 :
デフォルトの名無しさん :2011/05/22(日) 13:53:49.99
JNI、Cで組んでみたんだけどすげー面倒臭い… ベターC的なノリでC++でやることについてどう思う?
>>781 CからJVMにアクセスする場合はどうすんの?
なぜJava狂信者はJavaがC#よりも優れていると言うのか JNI使ったらJavaのアドバンテージ無いだろ
jniでc#を下請けに使える。
そもそもJNIなんて仕方なく使うもんだろ java、C#優劣論争なんて他所でやれw
791 :
デフォルトの名無しさん :2011/05/24(火) 11:07:14.14
むしろ積極的に使って楽しんでる。 cの世界、javaの世界だけで済ませるのでは選択肢少ないし。 javaで描かれたデバドラやosなんて無いし、cで描かれた移植性の高いアプリも無い。 男だけの会社とか女だけの会社が無いのと同じ。それぞれに剥いた仕事させれバいいじゃないの。バカと挟みは使い用。所詮目的を達成する手段にすぎない。
にほんごでおk
794 :
デフォルトの名無しさん :2011/05/29(日) 10:30:54.03
やっぱりここの人たちは皆JNI使いか?JNAとか使っている人いるの?JNAeratorとか使いやすくないのか?
795 :
デフォルトの名無しさん :2011/05/31(火) 21:07:45.86
ネイティブのメソッドにJavaのクラスを入れて、メソッド内で削除してメモリ解放したら ガーベージコレクトは走らないという事なのかな?
JNI上で作成したオブジェクトは別メモリ管理だからしっかりガベッジコレクタの対象になるとおもうよ でも、使用方法誤るとEJBみたいにVMが暴走する
そこはそういうもんだな。糊で張り合わせて動かしてるものだし。ウマく動くほうが奇跡的w ちゃんとメモリ喰い潰しを検出して定期的に再起動かます様な運用で対処してる。原発に津波じゃないけど予め想定しておけば対処方法は有る。 cでもメモリリークしまくってる屑アプリはいくらでもあるし。
なるほど、JNI側のメモリとJava側のメモリは別々に考える必要があるのですか ちょっとしたメソッドをネイティブにするくらいなら大丈夫そうだけど、 クラスとか大きいものをネイティ管理するのは大変そうだ
799 :
デフォルトの名無しさん :2011/06/10(金) 01:27:39.63
Java→Native(C言語)の呼び出しで、引数に文字列領域設定して Native側でそこに文字列設定するのってどうやるんですか? (Native関数のポインタ渡しみたいなイメージ) #Native側でのSetObjectArrayElementによる文字列配列渡しなら見つけたんですが。。。
普通にchar[]とかbyte[]渡して設定して貰うんじゃダメなん? java.nio.CharBufferとかjava.nio.ByteBufferでもいいけど。
そこはjavaとcは別の世界だから、欲しいデータがあれば直接中身をやり取りしないと駄目なんじゃない。 cpuのコアが違って、レジスタ参照が出来ない様な感じ。一旦バス経由で自分の世界に持って来ないと使いにくい。 ハードウェアのnumaみたいな共有メモリで性能を稼ぐ様な実装はまだjniには無いかと。ぐぐってもmmap共有しちゃうような実装は無さそう。
java.nio.ByteBuffer#allocateDirect()すりゃいいだけだな。
StringBufferっていう便利なクラスがあるのを知らんのか?
そのレベルの人が触っちゃいけないもんだがな〜 趣味マが無駄にパフォーマンス気にしてどっかで騙されて来てんのかね?
Eclipsからさっくりnativeのヘッダ作ったり、JNIのコンパイルする方法って無いでしょうか
ant使えばできないことはない
できないことはない。ということは鉄板の方法は特にないと言うことですか やっぱ、ちょっとハードル高いなぁ
これ ; デリミタっていうんだけどさ、これをつけなきゃエラーになるような そんな言語使ってる奴ってどうみてもゴミだと思うんだけど もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの? そうか、二度と話かけんなよ ゴミって意味わかってんのかなこいつら
これ。句点っていうんだけどさ、これをつけずに文章が成立するような そんな言語使ってる奴ってどうみてもゴミだと思うんだけど。 もしかして「。」これ打たずに文章の終わりにするのが楽しいの? そうか、二度と話かけんなよ。 ゴミって意味わかってんのかなこいつら。
>>807 ∨∨∨∨∨∨∨∨
(((((( ant使えばできないことはない ))))))(きリッッ!!ッッッッ!
∧(キリッッッッ!!!
でもお前はゴミなのにねw
JavaからC系を呼べるのは良いとして、そのCからJava側のサービスを使いたい時は、手段はあるの? 例えば音を鳴らすAPIがJavaにしかない処理系とかで、C側の処理の途中で音を鳴らしたくなった時とか。
あるよ
815 :
デフォルトの名無しさん :2011/07/11(月) 00:58:43.30
JNAerator使っているやついる? 便利?
816 :
デフォルトの名無しさん :2011/07/27(水) 18:15:13.68
今日JNIの本を買おうか買うまいか迷ってしまった。古い本ではあるが、 何回も刷られているから良書なのかな?
買ったらレポよろ
819 :
デフォルトの名無しさん :2012/04/12(木) 15:12:38.02
過疎ってるな。androidやってる連中が書き込んでるかと思ったが。
板的に情報書き込みにくる人が少なくなったと思うから、ここも同じく。
jni自体に語るほどの内容がないよね 単にシェアードライブラリやdllのインターフェース 定義してるだけだし、業務資料作った事あるけど A4用紙一枚半で十分だった。
板どころじゃなくてにちゃんごとだな。 にちゃんにくるより他所の無料サイトのほうが詳しい人や中の人そのものが答えてくれたり。 元々オープンソースで誰が作ってるかモロバレだったしユーザ会繋がりも密だったから、わざわざ制限が多くて印象悪い匿名掲示板の価値が消失しちゃってる。 単純に無関係な規制に巻き込まれて、情報提供車が逃げ出しちゃったってのも大きいだろうけど。 若い人ほど、にちゃんから離れて各種snsで満足してるのも学生とかの新規参入が減って過疎高齢化招いてる要素か。 京大の入試問題を知恵袋で聞いてるなんて象徴的だったし。若者ほど、もうにちゃんの存在意義失ってる。 情報というか書き込みがコンテンツなんだから、書き込み減ればにちゃんの価値が下がるのは自明だしな。それを書き込ませない規制で加速させてたらそりゃ氏ぬ輪。 処理自体はjniライブラリを介して伝言ゲームしてるのとな時だしな。 福島原発ー東電ー経産省ー官邸ー総理 と同じ様に javaのクラスーjnixライブラリーcライブラリ で伝言ゲームしまくってる。 使い方だけ示せば、あとは呼び出す側のapiやクラスの仕様そのまんまだし。 もう少し進めて、どういう用途か絞り込めれば、包んで呼び出す側のクラスやapiの仕様に合わせてしまって使いやすく用意もできる。 アンドロイドはまだ混沌としすぎてるから、手を出しにくいんじゃない。 nexsus oneとかギャラネクみたいな特定機種で動けばいいだけならばりばりjnixで呼びまくってもいいだろうけど、 逆に国内機種とか搭載アプリの特定ハード向けの作り込みでは、バリバリ多様化されているんじゃない。べつにjniしなくてもcで全部作っちゃってもいいかもしれないけど。
日本語でおか