2016.06.16この記事は約7分で読めます。Impalaという分散クエリエンジンを使っていてImpaladが突然JVMのSIGSEGVで異常終了してしまうことがありソースを追いかけている。Interface)に関して自分なりに調べ以下備忘録としてまとめてみる。Interface)Javaの世界とC/C++の世界との間をつないでくれる。JavaとC/C++のようなネイティブで実行されるプログラム間で連携するためのインターフェース仕様。JavaからC/C++で書かれたプログラムを呼び出したり、逆にC/C++からJavaのオブジェクトを呼び出したりすることが可能。Startまずは、簡単なサンプルを動かしてみて実行イメージをつかむ。JavaからC/C++のプログラムを呼ぶ以下のステップで実行する。library)を生成JavaからSystem.loadLibraryでダイナミックライブラリをロード実行まずは、nativeメソッド定義する。ここでは、引数に渡した文字列を出力する単純なサンプルを想定している。JNI");}}続いてコンパイルする。build/classes/クラスファイルからjavahでヘッダファイルを生成する。sample.JNITestこれにより生成されたファイルは以下のようになる。__cplusplus}#endif#endifメソッド名は、以下のような規則で構成されるらしい。C++で書くと多少ポインタ周りがスッキリする。str);}ダイナミックライブラリを作成する。\sample_JNITest.cc最後にJavaを実行して正常にロードされているか確認。JNIC/C++からJavaのプログラムを呼ぶ続いて今度はC/C++からJavaのプログラムを呼び出す例を見てみる。基本的な流れは以下のようになるだろうか。以下実際のソースで見てみる。ここでは、java.lang.Mathクラスのrandomメソッドを実行してみる。EXIT_SUCCESS;}続いてコンパイル。6の環境がインストールされていないとダイアログが表示されて実行することができない。取り急ぎの実行に際しては、以下のリンクから過去のバージョンをダウンロードすることができる。MappingJavaとC/C++の世界ではルールも異なればデータの型も異なる。したがって両者の間で型をどのように扱うのか、あらかじめ取り決めをしてやる必要がある。jni.hを参考にすると以下のようにマッピングされていることがわかる。–その他以下のようなタイプエイリアスやマクロが定義されている。以下のような構造になっている。jthrowableSignatureJVMの型のシグネチャー表現は以下のようになっている。.classファイルを開くと見かける英数字や記号などのアレ。以下jvm.hからの抜粋。'Z'上の表現でなんとなくわかるが、まとめると以下のようになる。voidこれにより、あらためてC/C++からのJavaプログラムを実行するのには以下のようになる。MacJavaをデバッグ実行したくOpenJDKをmac上でビルドした時のメモ。僕の環境は以下の通り。...javaJavaで作成した一時ファイルを終了時に削除するJavaのjava.nio.file.Filesで作った一時ファイルをプログラム終了時に削除するのにFilesクラスにそれ用のAPIがあるかと思っていたけどなかったので以下のようにして対応した。worksアノテーションさえ十分に使いこなせていないが、、javaのlombokライブラリについて調べる機会があったので自分なりにまとめてみる。コメントをキャンセルメールアドレスが公開されることはありません。»タイトルとURLをコピーしました。