我正在使用Android.mk工具包,并拥有这个Android.mk文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ocaml
LOCAL_SRC_FILES := ocaml/hello.so
include $(PREBUILT_SHARED_LIBRARY)
# ocamlfind -toolchain android ocamlopt \
# -output-complete-obj -cclib -shared hello.ml -o hello.so
include $(CLEAR_VARS)
LOCAL_MODULE := simple_test
LOCAL_SRC_FILES := main.c
# This name had to be that created shared library
LOCAL_STATIC_LIBRARIES := ocaml
LOCAL_C_INCLUDES += /home/gar/.opam/android_coding/lib/ocaml
include $(BUILD_EXECUTABLE)这将成功编译并在/home/gar/ocaml_on_android/libs/armeabi、simple_test和hello.so中创建。
然而,当我在我的Nexus 7上运行代码时,我得到
CANNOT LINK EXECUTABLE: library "/home/gar/ocaml_on_android/obj/local/armeabi/hello.so" not found
这意味着它在编译时没有正确地链接。我如何编写这个Android.mk文件,以便在一个可执行文件中静态地编译所有内容?
编辑:注释之后,使用以下内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ocaml
LOCAL_SRC_FILES := ocaml/hello.so
include $(PREBUILT_SHARED_LIBRARY)
# ocamlfind -toolchain android ocamlopt \
# -output-complete-obj -cclib -shared hello.ml -o hello.so
include $(CLEAR_VARS)
LOCAL_MODULE := simple_test
LOCAL_SRC_FILES := wrapper.c
# This name had to be that created shared library
LOCAL_SHARED_LIBRARIES := hello.so
LOCAL_C_INCLUDES += /home/gar/.opam/android_coding/lib/ocaml
include $(BUILD_EXECUTABLE)在项目的libs文件夹中,我仍然有两个对象,hello.so和simple_test exectuable,我希望只看到一个对象。对于LOCAL_SHARED_LIBRARIES,不确定是否需要将模块名、ocaml或实际的共享对象hello.so。无论是哪种情况,仍然会在libs目录中生成两个对象。
EDIT2:我现在为我的Android.mk准备了这个
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ocaml
LOCAL_SRC_FILES := ocaml/hello.so
include $(PREBUILT_SHARED_LIBRARY)
# ocamlfind -toolchain android ocamlopt \
# -output-complete-obj -cclib -shared hello.ml -o hello.so
include $(CLEAR_VARS)
LOCAL_MODULE := simple_test
LOCAL_SRC_FILES := wrapper.c
# This name had to be that created shared library
LOCAL_CFLAGS := -Wl,-Bstatic -static
LOCAL_SHARED_LIBRARIES := hello ocaml
LOCAL_C_INCLUDES += /home/gar/.opam/android_coding/lib/ocaml
include $(BUILD_EXECUTABLE)当我检查创建的可执行文件时,我仍然看到它取决于共享库。
arm-linux-androideabi-readelf -d simple_test | grep NEEDED
0x00000001 (NEEDED) Shared library: [/home/gar/asm_on_android/obj/local/armeabi/hello.so]
0x00000001 (NEEDED) Shared library: [libstdc++.so]
0x00000001 (NEEDED) Shared library: [libm.so]
0x00000001 (NEEDED) Shared library: [libc.so]
0x00000001 (NEEDED) Shared library: [libdl.so]我还在设备上的shell上尝试了LD_LIBRARY_PATH=. ./simple_test命令,但得到了以下错误:
LD_LIBRARY_PATH= . ./simple_test
sh: ./simple_test[1]: syntax error: '\
4' unexpected发布于 2015-12-08 16:43:18
感谢亚历克斯的帮助。
我决定暂时跳过Android,而只是选择了一个直接的Makefile解决方案,这是可行的。
这是Makefile
cc := arm-linux-androideabi-gcc
sys_root := /Users/Edgar/.opam/4.02.3+32bit/lib/android-ndk/platforms/android-21/arch-arm
includes := /Users/Edgar/.opam/4.02.3+32bit/arm-linux-androideabi/include
ml_includes := /Users/Edgar/.opam/4.02.3+32bit/arm-linux-androideabi/lib/ocaml/
libs := /Users/Edgar/.opam/4.02.3+32bit/arm-linux-androideabi/lib
# Be sure to do export LD_LIBRARY_PATH=. and then run the program.
# Not sure how to do static linking yet, this will only dynamically
# link the program
complete: lib
$(cc) --sysroot $(sys_root) -I$(includes) -L$(libs) \
-pie -I$(ml_includes) hello.so main.c -o Finished
lib:
ocamlfind -toolchain android ocamlopt -output-complete-obj \
-cclib '-lm -shared' hello.ml -o hello.so
# This is a pure OCaml exectuable
exec:
ocamlfind -toolchain android ocamlopt \
-verbose -ccopt '-fPIE' -cclib '-pie' hello.ml -o hello
.PHONY: clean
clean:
@rm -rf *.{cmi,cmt,o,cmx,so} Finished...Substitute您的名字和路径,酌情。还把回购放在这里,android
发布于 2015-12-07 19:30:49
共享库就是这样使用的。您可以在hello.so可执行文件附近将simple_test推送到设备上。
Android.mk的语法应该是
LOCAL_SHARED_LIBRARIES := ocaml在shell命令行上,使用
LD_LIBRARY_PATH=. ./simple_testhttps://stackoverflow.com/questions/34124770
复制相似问题