2016-04-25 8 views
1

JavaプロジェクトでC++コードを使用するためにJNI呼び出しのセットを作成しようとしています。私はそれをC言語のコードとして記述し、GCCでコンパイルすると、うまく機能しているように見えますが、関数名は正しいです(Java_myPackage_MyClass_myFunction)。G ++でコンパイルされたDLLの関数名が異なります

しかし私はCの代わりにC++で必要なことを行う方が簡単だと思っています。私がC++で持っているコードをコンパイルしようとすると、私が見ることのできるヘッダーファイルはすべて正しいです。私はそれをコンパイルするとき、私のJavaコードでこのエラーが発生する++グラムによって生成されたDLL:私は依存関係ウォーカーでDLLをチェックすると、機能がそれに間違った名前を持つ

Exception in thread "main" java.lang.UnsatisfiedLinkError: package.class.function(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 
at package.class.function(Native Method) 

は、それが_Z52Java_package_class_functionP7JNIENV_P8_jobjectP8_jstringS4_

に変更されています

Java_package_class_functionとして依存関係ウォーカーに表示されるべきだと思うとき

これは私が

g++.exe -Wl,--add-stdcall-alias -I "C:\Program Files\Java\jdk1.8.0_73\include" -I "C:\Program Files\Java\jdk1.8.0_73\include\win32" -shared -o C:/repos/myproject.dll myproject.cpp -lssl -lcrypto 

++グラムでDLLをコンパイルするために使用しているコマンドは、私は、コンパイルに欠けている何かがそこにはありますか?私はJNExportとしてリストされ、extern "C" {}でラップされた私の.hファイルの関数を持っています。私は関数の命名/呼び出しがコンパイル時に変更される理由を全く明らかにしていません。

環境は、JDK 1.8 for Javaを使用してWin7でCygwinでコンパイルしています。私の.hファイルで

関数の宣言は:

extern "C" { 
JNIEXPORT jstring JNICALL Java_package_class_function(JNIEnv *, jclass, jstring, jstring); 

JNIEXPORT jstring JNICALL Java_package_class_function(JNIEnv *, jclass, jstring, jstring); 


char * aes_encrypt_string(char *, char *, char *); 
char * aes_decrypt_string(char *, char *, char *); 

} 

私はそこにexterncを持っており、AES機能が.dllファイルに正しくエクスポートされているが、他の2つの機能は、余分な装飾を取得しています。

答えて

0

C++コンパイラは、名前マングリングを使用してシンボルテーブルに一意のエントリを作成します。各関数はすでに一意でなければならないので、これはCコードでは必要ありません。名前のマングリングが関数定義をラップするのを防ぐにはextern "C" { }

詳細については、in-c-source-what-is-the-effect-of-extern-cおよびa duplicate of your questionを参照してください。

+0

extern cで囲まれた.hファイルの宣言があります。上記の質問に私の.hファイルの要点を追加します – jspriggs

関連する問題