過去数年間、X25プロトコルを使用するプログラムを作成しました。これはC言語で作成されており、Solaris5.9を搭載したSun-Fireマシンで正常に動作します。最近、同じマシンでjava 6を使用しており、jniを介してjavaを使用できるようにCの古いプログラムを適応させようとしています。だから私は古いCプログラムにいくつかの変更を加え、という名前の共有ライブラリを作成しました x25lib.so
しかし、jniとX25を使用して実行時の問題を発見しました。C関数がJavaからjniを介して呼び出された場合、Cコードは別のCプログラムから呼び出された場合と同じようには機能しません。
具体的には、jniを使用すると、共有ライブラリのCコードは、システムコールが呼び出されるまで正常に機能しconnect()
、その後-1を返します。
しかし、別のCプログラムから共有ライブラリの同じCコードを呼び出すと、0(ok)が返されます。
どちらの場合も、共有ライブラリのCコードは外部パラメータを受け取らないため、条件は同じです。Javaから「x25lib.so」共有ライブラリをロードするconnect()
際に、Cでの誘導に少し違いがあるかどうかはわかりません。
javaから「truss」コマンドを使用すると、エラーが見つかりました。
/2: connect(5, 0xFD878B75, 112, 1) Err#22 EINVAL
同じですが、別のCプログラムから共有ライブラリを呼び出します。
connect(4, 0xFFBFE794, 114, 1) = 0
したがって、純粋な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。Javaの使用:
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();
}
}
次に、Cコード共有ライブラリで:
/*
* 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から呼び出された場合は失敗するのはなぜですか?
アドバイスありがとうございます。