2010-12-08 11 views
2

小さなJNIライブラリが必要なUSBハードウェアインタフェースボードと通信するプログラムを書いています。私は、コンパイル・マシン上で10.5.8を実行していて、正常に次のコマンドを使用してJNI用共有ライブラリをコンパイルすることができます。MacOSでPPC G3のクロスコンパイル10.3.9

# Build shared library for K8055 
g++ -x objective-c -fmessage-length=0 -pipe -Wno-trigraphs \ 
    -fpascal-strings -fasm-blocks -O0 -mdynamic-no-pic -fvisibility=hidden -gdwarf-2 \ 
    -Wmost -Wno-four-char-constants -Wno-unknown-pragmas \ 
    -c ./K8055/K8055.m \ 
    -o ./K8055/K8055.o \ 
    -arch x86_64 \ 
    -arch i386 

echo "Building JNI shared library..." 
gcc -c -m64 -I/System/Library/Frameworks/JavaVM.framework/Headers \ 
    k8055usbio.m -o k8055usbio.so -arch x86_64 

echo "Compiling dynamic library with both..." 
g++ -m64 -dynamiclib -o ./lib/libk8055usbio.dylib \ 
    k8055usbio.so ./K8055/K8055.o\ 
    -framework Foundation -framework IOKit 

私は本当に私がここでやっているのか理解していません。私はグーグルで多くのことを一緒にしています。私の質問は:10.3.9を実行しているPPC G3マシンのためにこれをどのように変更するのですか?私が満足しているJavaの部分。ここで私はこれまで試したものです:

dyld: java bad CPU subtype in library: /libk8055usbio.dylib 
Trace/BPT trap 

I:

# Build shared library for K8055 (PPC) 
echo "Building driver shared library..." 
g++ -x objective-c -fmessage-length=0 -pipe -Wno-trigraphs \ 
    -fpascal-strings -fasm-blocks -O0 -mdynamic-no-pic -fvisibility=hidden -gdwarf-2 \ 
    -Wmost -Wno-four-char-constants -Wno-unknown-pragmas \ 
    -c ./K8055/K8055.m \ 
    -o ./K8055/K8055.o \ 
    -arch ppc 

echo "Building JNI shared library..." 
gcc -c -I/System/Library/Frameworks/JavaVM.framework/Headers \ 
    k8055usbio.m -o k8055usbio.so -arch ppc 

echo "Compiling dynamic library with both..." 
gcc -shared -fPIC -o ./lib/libk8055usbio.dylib k8055usbio.so \ 
    ./K8055/K8055.o -framework Foundation -framework IOKit -arch ppc 

をしかし、私はは、System.load()は、私は、Java(1.5)プログラムから次のエラーを取得しようとすると、それを修正する方法がわからない、どのCPUサブタイプを指定するべきか?

答えて

5

あなたはいくつかのオプションを試す必要があります。まず、新しいSDKはさまざまな方法であなたを覆すため、明示的に-isysrootを使用してSDKを指定する必要があります。次に、-mmacosx-version-min = 10.3を渡して、10.3で実際に実行したいことを示します。小さなテストプログラムでこれらのオプションを両方使うと、私はG3で動くべきだと主張するバイナリを手に入れます。ここに私のコマンドラインです:

gcc-4.0 -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk/ -mmacosx-version-min=10.3 -o testprog testarch.c 

あなたはこの例のために私を与えるotool -hを使用して、ヘッダー内のCPUタイプ/サブタイプをチェックする正気ことができます。

$ otool -h testprogtestprog: 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
0xfeedface  18   0 0x00   2 11  1268 0x00000085 

CPU_SUBTYPE_POWERPC_ALLは/開発者ごとに、そこにあるゼロ/SDKs/MacOSX10.4u.sdk/usr/include/mach/machine.h。

+2

'-arch ppc'と10.4u SDKと共に' -arch i386'を追加することで、OS X 10.3.9を実行するMacで動作する汎用バイナリになるはずです。電流10.6。 –

+2

'otool -hv'(または' -hV')を使って、ほとんどのフィールドをデコードすることもできます。 –

+1

ええ、明らかに私は-vを忘れていました。ありがとう! –