私はいくつかのJava < - > .Net interopコードを実行しています。それらの間にネイティブライブラリを使用しています。Java JNIEnvセグメンテーションフォールト
しかし何らかの理由で私はJNIEnvの下ではどのメソッドも実行できません。
System::String^ JNIStringToNet(JNIEnv * env, jstring js)
{
const char *buf = env->GetStringUTFChars(js, 0); // segfault
ここで、変数を前後に渡して他の種類の通信を行うことができるので、これを正しく初期化していないと考えられます。
私はこのようにそれをロードしています:私が、このような複数のライブラリとの間で、クラスの共有と、それをより簡単に、より行うことができているようですので、
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
は(私はNative.loadLibraryを好むアンフックし、それをrehookingその場でJVMから)。
編集:
真剣にいずれかの方法:
std::cout << "Getting version:" << std::endl;
std::cout << env->GetVersion() << std::endl;
取得バージョン:
(セグメンテーション違反)
すべてのメソッドのためにセグメンテーションフォールトうWHT JNIEnvの上の任意のアイデア?これはJVMで設定する必要がありますが、正しいですか?
編集2:
これは、.NETライブラリとのインタフェースになるC++ライブラリを呼び出しているJavaアプリケーションである(それはどんな違いがあればそれは、CLRコンパイルC++ライブラリです)、制限します任意の外部要因私は.NET DLLを呼び出していませんが、戻って来る文字列を変換するだけです。それはそれを引き起こしていたCLRた場合
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
this.Lib.myCPPMethod(); // Segmentation fault during this call, JVM crashes.
興味:Javaから例えばので
無効CLRのコンパイルとそれはCLR関連だったから、すべてを剥奪、まだそれはありません。
編集3:
はそれをダンプするためにガット:JVMは、私にいくつかの理由のためのメモリアクセスを与えていないよう
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000000000000, pid=1596, tid=7248
#
# JRE version: 6.0_23-b05
# Java VM: Java HotSpot(TM) 64-Bit Server VM (19.0-b09 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C 0x0000000000000000
はそうそう、見えます。
編集4:
実際の呼び出し:
JNIEXPORT jstring JNICALL Query(JNIEnv * env, jobject jobj, jstring start, jstring end)
{
std::cout << "Getting version:" << std::endl;
jint j = env->GetVersion();
return jstring("test");
}
編集5:システムと
作品。LoadLibrary関数:
JNIEXPORT void JNICALL Java_LibTest_T(JNIEnv *env, jobject jobj)
{
std::cout << "Getting version:" << std::endl;
jint j = env->GetVersion();
std::cout << j << std::endl;
}
出力:
java -Djava.library.path="(dir)\lib\64" EntryPoint
Getting version:
65542
Ackを!私はいくつかの進歩を意味しますが、System.loadLibraryにロードされているライブラリをJVMからアンロードできませんか?
私は基本的に、これらのライブラリをJVMから切り離してスワップする必要があります。その上に、すべてのクラスを「共有」し、実行時にクラスにバインドできる必要があります。私はなぜNative.loadLibraryに行ったのですか?
現在、私はこれを行う:
は、DLLをロードします。
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
外すこと:私はにそれらすべてをロード
this.Lib = null;
Runtime.getRuntime().gc(); // Force the JVM to drop it immediately.
クラス:
public interface LibHandler extends Library{
void T();
}
任意の方法System.loと同様に動作するadLibrary?
編集6:
完全に異なると私の問題の巨大なソースではありません JNI、ダム私を呼び出すこと自由に感じ、私はJNA、を使用しています....方法がありますJNIでこれを行うには?または、JNIEnvをJNAに登録するようにしてもいいですか?私はC++ライブラリからJNIを落として、まっすぐなwstringsを使うことができると思いますか?
私はこの明日に戻ってきます。
あなたはもう少しを与えることができます詳細は?これはJavaのネイティブライブラリ経由で.NETコードを呼び出すか、.NET呼び出し元のJavaからネイティブライブラリですか? –
.NetからJVMを呼び出しようとしていますか、その逆ですか?前者の場合は、Invocation API(Google検索を使用)を使用する必要があります。具体的には、JNI_CreateJavaVMを呼び出す必要があります。 –
これで申し訳ありませんが、現在2つのアドレスを編集しています。 :) JavaからC++ DLLへの呼び出しです。 – StrangeWill