2011-07-27 5 views
5

私はいくつかの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を使うことができると思いますか?

私はこの明日に戻ってきます。

+0

あなたはもう少しを与えることができます詳細は?これはJavaのネイティブライブラリ経由で.NETコードを呼び出すか、.NET呼び出し元のJavaからネイティブライブラリですか? –

+0

.NetからJVMを呼び出しようとしていますか、その逆ですか?前者の場合は、Invocation API(Google検索を使用)を使用する必要があります。具体的には、JNI_CreateJavaVMを呼び出す必要があります。 –

+0

これで申し訳ありませんが、現在2つのアドレスを編集しています。 :) JavaからC++ DLLへの呼び出しです。 – StrangeWill

答えて

0

さて、私は悪い気分です。

Native.loadLibrary == JNA。

System.loadLibrary == JNI。

JNAの目的があるとして、あなたがネイティブライブラリを実行できるように、JVM環境のいずれかの本当の知識を必要としないことですので、代わりにあなたはchar *型を使用することができますJSTRINGの...

関連する問題