在HP-UX-IA64下編譯JFFI及FFI遇到很多問題,官網jffi文檔中也並沒有在hp-ux-ia64平台上有編譯過。
次文檔僅為記錄之用。記錄編譯過程,但並不意味着本人遇到的問題已經解決。
注意點:
1. hpux上裝的gcc 4.3.2.編譯時默認是32位。編64位需要加參數: -mlp64
2. hpux上的jdk(1.6)目錄結構與linux上jdk目錄不一致。64位版本java/javac/javah命令行在$JAVA_HOME/bin/IA64W目錄下。ant啟用$JAVA_HOME/bin的java命令,默認是32位的。解決的方法可以建文件夾然后 ln -s 三個命令連接,修改相應的$JAVA_HOME。
3. ant jar生成complete.jar,jffi.jar 等jar包時,腳本能識別機器。但是jffi的java代碼里面並不支持ia-64-hpux導致打包的目錄是unknown-HP-UX.查看jffi-1.2.7/src/main/java/com/kenai/jffi/internal/StubLoader.java文件,源代碼中CPU未定義IA64,OS也未定義HPUX。導致取不到CPU,OS值是unknown。
如不改源代碼。build.xml中需要修改打jar包時的目錄。否則ant test會報can't load jni/unknown-HP-UX/libjffi-1.2.so文件
4.需要修改makefile內容及.h頭文件如下:
export CC="gcc -mbig-endian -mlp64 -pthread"
export LD="gcc -shared -fPIC -mbig-endian -mlp64 -mt -static-libgcc -Wl -O1 -lrt -ldl -lpthread"
jffi-1.2.7/GNUmakefile
SRC_DIR ?= $(shell pwd)/jni
==>
SRC_DIR ?= $(shell pwd)
JFLAGS = -fno-omit-frame-pointer -fno-strict-aliasing -DNDEBUG
==>
JFLAGS = -fno-omit-frame-pointer -fno-strict-aliasing -DNDEBUG -DMAP_ANON=MAP_ANONYMOUS -DFFI_NATIVE_RAW_API=0
FFI_CC = $(CCACHE) $(CC)
==>
FFI_CC = $(CC)
jffi-1.2.7/libtest/GNUmakefile
$(CCACHE) $(CC) $(CFLAGS) -c $< -o $@
==>
$(CC) $(CFLAGS) -c $< -o $@
SOFLAGS = -shared -Wl,-O1
==>
SOFLAGS = -shared -Wl -O1
jffi-1.2.7/jni/jffi/endian.h
添加
# define LITTLE_ENDIAN 1234
# define BIG_ENDIAN 4321
# define BYTE_ORDER BIG_ENDIAN
jffi-1.2.7/jni/jffi/jffi.h
添加,免得很多文件都要加這個.h文件
#include <alloca.h>
jffi-1.2.7/jni/jffi/LongDouble.c
ld = strtold(tmp, NULL);
==>此處修改有點不負責任。128位的long double改成64位的double。實際應該用得不多,先將就下。。。
ld = strtod(tmp, NULL);