過去にX25プロトコルを使用するプログラムを作成しました。これはC言語で作成され、Solaris 5.9でSun-Fireマシンで正常に動作します。 最近、私たちは同じマシンでjava 6を使って作業しています。私たちはjni経由でjavaを使って作業するために、Cで古いプログラムを適応しようとしています。 だから私は古いCプログラムにいくつかの変更を行い、x25lib.so
コードがSolaris 5.9でシステムコール "connect()"を使用するときのjni(java6)およびX25ネイティブコード(C言語)でのエラー
という名前の共有ライブラリを作成した。しかし、私はJNIとX25を使用して実行時の問題を発見したしている:C関数は、JNIを経由して、Javaから呼び出されると、Cのコードがありません別のCプログラムから呼び出されたときと同じように動作しません。その後、システムコールconnect()
を呼び出されるまで、JNIを使用して、共有ライブラリ内のCコードは正常に動作し
コンクリート、-1を返し、
しかし、別のCプログラムからの私の共有ライブラリの同じCコードを呼び出すと0を返します。 (ok)
どちらの場合でも、共用ライブラリのCコードは外部パラメータを受け取っていないので条件は同じですが、私の "x25lib.so"共有ライブラリをjavaから少し読み込むと理解できませんCの中でconnect()
を誘発する違いは失敗します。 Javaから「トラス」コマンドを使用して
は私がエラーを発見した:
/2: connect(5, 0xFD878B75, 112, 1) Err#22 EINVAL
同じように、しかし、別のCプログラムから共有ライブラリを呼び出す:
connect(4, 0xFFBFE794, 114, 1) = 0
ことだからだけでOK動作します純粋なC、
solaris 5.9にjniとX25を使用することについてのもう一つの考慮事項はありますか?
重要:共有ライブラリのCコードは、どちらの場合も同じです。
コンパイル時間:
a。作成x25lib.so
cc -w -fd -G -Kpic subs.o -L/opt/SUNWconn/lib -R/opt/SUNWconn/lib -lsockx25
-lsocket -lnsl -I"/SDK/jdk/include/" -I"/SDK/jdk/include/solaris/"
-o x25lib.so -h x25lib.so x25jni.c
b。その共有ライブラリを使用してテストCプログラムを作成する:
cc -w x25lib.so -o x25test x25test.c
where `x25test.c` contains:
#include <stdio.h>
main()
{
java_x25();
}
c。 Cコードの共有ライブラリに続いて
public class X25 {
static {
System.load("/home/x25lib.so");
}
public native void ejecutaComando();
}
public class TestX25 {
public static void main(String ... args) {
X25 x25 = new X25();
x25.ejecutaComando();
}
}
:Javaを使用して
/*
* Class: X25
* Method: ejecutaComando
* Signature:()V
*/
JNIEXPORT void JNICALL Java_X25_ejecutaComando
(JNIEnv *env, jobject obj)
{
java_x25();
}
だから、最終的には両方のプログラム(JavaのYのC)の呼び出しとまったく同じC共有ライブラリのコード:
java_x25()
パラメータがないので、同じコードを実行してください。
Cから呼び出されたときにうまくいくが、javaから呼び出されたときに失敗するのはなぜですか?
ありがとうございました。
あなたはあなたのスタンドアロン「C」コードは、あなたのJNIコードと同じですか? – EJP
あなたの答えEJPに感謝します。はい、コードは同じです、それは私の不満です。私は自分の質問を編集し、それがスタンドアロンのCコードと同じコードが呼び出されることがわかるはずのjniコードを追加します。 – aoe