Android NDK工具链无法使用“.so.0.6-File”

时间:2013-07-03 12:31:44

标签: android android-ndk makefile

我正在尝试编译NDK项目。因为我必须使用外部.so文件。 它被编译为libpcan.so.0.6这个名称,因为makefile正在编译这个库:

LDNAME = libpcan.so
SONAME = $(LDNAME).0
TARGET = $(SONAME).6

我的receivetest.c文件需要此libpcan.so.0.6包含的函数。 android-toolchain不接受文件结尾“.so.0.6”,所以我将文件重命名为libpcan.so。我的Android.mk将此.so作为PREBUILD_SHARED_LIBRARY来编译我的receivetest.so。工具链正常运行。

当我启动Android App时收到错误消息:

 java.lang.ExceptionInInitializerError
Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1891]:    36 could not load needed library 'libpcan.so.0' for 'libreceivetest.so' (load_library[1093]: Library 'libpcan.so.0' not found)*

所以我的问题:我可以在创建它后重命名.so文件而不会导致问题吗? 为什么应用程序想要加载libpcan.so.0,将.so.0.6重命名为.so后,这个.so在ndk-toolchain中工作正常?

1 个答案:

答案 0 :(得分:0)

Android.mk编译我的receivetest.so

LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=libpcan
LOCAL_SRC_FILES :=libpcan.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE :=common
LOCAL_SRC_FILES := common.c
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE :=receivetest
LOCAL_SRC_FILES := receivetest.c
LOCAL_STATIC_LIBRARIES:=common 
LOCAL_SHARED_LIBRARIES:=libpcan
include $(BUILD_SHARED_LIBRARY)

编译pcan.so.0.6的外部Makefile很长:

CC := arm-linux-androideabi-gcc
SRC     = src
INC     = -I. -I../driver
FILES   = $(SRC)/libpcan.c
DBG     = -g
RT      = NO_RT

ifeq ($(RT), XENOMAI)
# Define flags for XENOMAI installation only
#
USB = NO_USB_SUPPORT
PCC = NO_PCCARD_SUPPORT

INC     = -I. -I../driver -I/usr/xenomai/include
SKIN = xeno
RT_DIR          ?= /usr/xenomai
RT_CONFIG       ?= $(RT_DIR)/bin/xeno-config
RT_LIB_DIR      ?= $(shell $(RT_CONFIG) --library-dir) -Wl,-rpath $(shell $(RT_CONFIG) --library-dir)
RT_CFLAGS       ?= $(shell $(RT_CONFIG) --$(SKIN)-cflags)
endif

ifeq ($(RT), RTAI)

# Define flags for RTAI installation only
#
USB = NO_USB_SUPPORT
PCC = NO_PCCARD_SUPPORT

INC     = -I. -I../driver -I/usr/realtime/include

SKIN = lxrt
RT_DIR          ?= /usr/realtime
RT_CONFIG       ?= $(RT_DIR)/bin/rtai-config
RT_LIB_DIR      ?= $(shell $(RT_CONFIG) --library-dir) -Wl,-rpath $(shell $(RT_CONFIG) --library-dir)
RT_CFLAGS       ?= $(shell $(RT_CONFIG) --$(SKIN)-cflags)
endif

ifeq ($(HOSTTYPE),x86_64)
  LIBPATH = /usr/lib64
else
  LIBPATH = /usr/lib
 endif
INCPATH = /usr/include

LDNAME  = libpcan.so
SONAME  = $(LDNAME).0
TARGET  = $(SONAME).6

ifneq ($(RT), NO_RT)
  CFLAGS = -fPIC -shared -O2 -Wall -Wl,-soname,$(SONAME) -lc $(INC) -D$(RT) $(RT_CFLAGS) -L$(RT_LIB_DIR) -lrtdm
else
  CFLAGS = -fPIC -shared -O2 -Wall -Wl,-soname,$(SONAME) -lc $(INC) -D$(RT)
endif

all:    $(TARGET)

 $(TARGET) : $(FILES)
# ln -sf ../driver/pcan.h pcan.h
$(CC) $(FILES) $(CFLAGS) -o $(TARGET)
ln -sf $(TARGET) $(LDNAME)

clean:
rm -f $(SRC)/*~ $(SRC)/*.o *~ *.so.*


install:
mkdir -p $(DESTDIR)$(LIBPATH)
cp $(TARGET) $(DESTDIR)$(LIBPATH)/$(TARGET)
ln -sf $(DESTDIR)$(LIBPATH)/$(TARGET) $(DESTDIR)$(LIBPATH)/$(SONAME)
ln -sf $(DESTDIR)$(LIBPATH)/$(SONAME) $(DESTDIR)$(LIBPATH)/$(LDNAME)
mkdir -p $(DESTDIR)$(INCPATH)
cp libpcan.h $(DESTDIR)$(INCPATH)/libpcan.h
chmod 644 $(DESTDIR)$(INCPATH)/libpcan.h
ifeq ($(DESTDIR),)
/sbin/ldconfig
endif

uninstall:
@-rm -f $(DESTDIR)$(LIBPATH)/$(TARGET)
@-rm -f $(DESTDIR)$(LIBPATH)/$(SONAME) $(DESTDIR)$(LIBPATH)/$(LDNAME)
@-rm -f $(DESTDIR)$(INCPATH)/libpcan.h
ifeq ($(DESTDIR),)
/sbin/ldconfig
endif

由于RT = NO_RT只考虑ifeq NO_RT的部分。