【发布时间】:2015-05-16 05:20:43
【问题描述】:
我目前正在使用 NDK 和 JNI 为 Android 应用程序开发 C/C++ 模块。
我需要用 CLang 编译这个 C 模块并使用静态链接来删除对 libc 的依赖。
静态链接到 libC 的编译在 GCC 上运行良好,但我无法在 CLang 上运行。我收到以下错误:
D:/tools/android-ndk-r10d/platforms/android-21/arch-arm/usr/lib/../lib\crtbegin_static.o:crtbrand.c:function _start: error: undefined reference to 'main'
下面的例子是在 Windows 上,但在 linux 上的问题是一样的。
用一个非常简单的 hello world 来演示问题:
你好-jni.c:
#include <jni.h>
jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz) {
return (*env)->NewStringUTF(env, "hello world");
}
makefile android.mk 是:
LOCAL_PATH := $(call my-dir)
ifndef NDK_PATH
NDK_PATH = C:/dev/android-ndk-r10d/
endif
SDK_VERSION = 21
include $(CLEAR_VARS)
LOCAL_MODULE := LibC
LOCAL_SRC_FILES := $(NDK_PATH)platforms/android-$(SDK_VERSION)/arch- $(TARGET_ARCH)/usr/lib/libc.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libhello
LOCAL_SRC_FILES := hello-jni.c
LOCAL_STATIC_LIBRARIES := LibC
LOCAL_CFLAGS += -nostdlib
LOCAL_LDFLAGS := -static -v
include $(BUILD_SHARED_LIBRARY)
和application.mk:
APP_ABI := armeabi-v7a
NDK_TOOLCHAIN_VERSION := clang3.5
如果它有任何用处,为 LDFLAGS 设置 -v 标志会给我:
"D:/tools/android-ndk-r10d/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin\ld.exe" --sysroot=D:/tools/android-ndk-r10d/platforms/android-21/arch-arm -X -m armelf_linux_eabi -Bstatic -dynamic-linker /system/bin/linker -o ./obj/local/armeabi-v7a/libhello.so "D:/tools/android-ndk-r10d/platforms/android-21/arch-arm/usr/lib/../lib\\crtbegin_static.o" -LD:/tools/android-ndk-r10d/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.8 -LD:/tools/android-ndk-r10d/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/lib/../lib -LD:/tools/android-ndk-r10d/platforms/android-21/arch-arm/usr/lib/../lib -LD:/tools/android-ndk-r10d/platforms/android-21/arch-arm/usr/lib/arm-linux-androideabi/../../lib-LD:/tools/android-ndk-r10d/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/lib -LD:/tools/android-ndk-r10d/platforms/android-21/arch-arm/usr/lib -soname libhello.so ./obj/local/armeabi-v7a/objs-debug/hello/hello-jni.o D:/tools/android-ndk-r10d/platforms/android-21/arch-arm/usr/lib/libc.a -lgcc --fix-cortex-a8 --no-undefined -z noexecstack -z relro -z now -lc -lm -lstdc++ -lm --start-group -lgcc -lc --end-group "D:/tools/android-ndk-r10d/platforms/android-21/arch-arm/usr/lib/../lib\\crtend_so.o"
D:/tools/android-ndk-r10d/platforms/android-21/arch-arm/usr/lib/../lib\crtbegin_static.o:crtbrand.c:function _start: error: undefined reference to 'main'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
make.exe: *** [obj/local/armeabi-v7a/libhello.so] Error 1
如果有人能帮助我,我将不胜感激!
干杯
【问题讨论】:
标签: android android-ndk clang