テストしているプログラムを実行しているとたまに落ちることがありました。調べていくとJNIEnv*の位置が変わっていました。現在の手順としては、起動時にJNIをたたき、引数で渡されたJNIEnv*をグローバルに保存して使いまわすという方向でやっていました。危険だとはわかっていましたがやはりガベコレの関係か場所が変わってしまうっぽいです。調査JNIEnv*がないとCからJavaを呼び出すことができないのでどうにかすれば取得できるだろうと思いいろいろと探してみました。通常のJNIでは、JNI_GetCreatedJavaVMs関数を使用しJavaVM*を取得し、これのメソッドのGetEnv関数を使用するとできるらしい。Memo)試してみたところ、リンク時にエラーになってしまう。JNI_GetCreatedJavaVMs関数は実装されていないらしい。感じ的には、JavaVM*が確保できればいいんだろうなと思いその方向で調べたところこんなものを発見。グループ起動時にJNI_OnLoad関数が呼び出されるらしく、ここの引数にJavaVM*が渡される。これを保存しておけばいいのではないかな?ソースんで、できたものがこんな感じになりました。){//取得失敗returnNULL;}returnenvRet;}JNIEnv*がほしいときにgetJNIEnv関数を呼び出すと取得することができます。問題点この処理でJNIEnvの扱いについては解決したぽいのですが、JavaVMは変更されないのかな?不安ですけれども前よりはだいぶ安定している感じなのでまた問題になりそうであれば変更しましょう。date*日本語が含まれない投稿は無視されますのでご注意ください。