为什么我在android ndk应用程序中得到错误的argc值?

为什么我在android ndk应用程序中得到错误的argc值?,android,android-ndk,Android,Android Ndk,c文件是mytest.c: include "stdio.h" include "stdlib.h" int main(int argc, char** argv) { int i=1; i+=2; printf("Hello, world (i=%d)!\n", i); printf("argc=%d\n", argc); exit(0); } 而Makefile是: APP := mytest ROOT :

c文件是mytest.c:

include "stdio.h"
include "stdlib.h"

int main(int argc, char** argv)
{
        int i=1;
        i+=2;
        printf("Hello, world (i=%d)!\n", i);
        printf("argc=%d\n", argc);

        exit(0);
}
Makefile是:

APP := mytest
ROOT := /opt
INSTALL_DIR := /data/local/tmp
NDK_PLATFORM_VER := 8
ANDROID_NDK_ROOT := $(ROOT)/android-ndk-r5b
ANDROID_NDK_HOST := linux-x86
ANDROID_SDK_ROOT := /opt/android-sdk-linux_x86
PREBUILD := $(ANDROID_NDK_ROOT)/toolchains/arm-eabi-4.4.0/prebuilt/$(ANDROID_NDK_HOST)
ANDROID_NDK_BIN := $(PREBUILD)/bin
ANDROID_NDK_INC := $(ANDROID_NDK_ROOT)/platforms/android-$(NDK_PLATFORM_VER)/arch-arm/usr/include
ANDROID_NDK_LIB := $(ANDROID_NDK_ROOT)/platforms/android-$(NDK_PLATFORM_VER)/arch-arm/usr/lib

CC := $(ANDROID_NDK_BIN)/arm-eabi-gcc
CPP := $(ANDROID_NDK_BIN)/arm-eabi-g++
LIBCRT := $(ANDROID_NDK_LIB)/crtbegin_dynamic.o
CFLAGS := -fno-short-enums -I$(ANDROID_NDK_INC)
LFLAGS := -nostdlib -Wl,--entry=main,-rpath-link=$(ANDROID_NDK_LIB),-dynamic-linker=/system/bin/linker,-rpath=/system/lib $(ANDROID_NDK_LIB)/crtbegin_dynamic.o
LDFLAGS = -lgcc -lc -L$(ANDROID_NDK_LIB)

all: $(APP)

OBJS += $(APP).o

$(APP): $(OBJS)
        $(CC) $(LFLAGS) $^ $(LDFLAGS) $(ANDROID_NDK_LIB)/crtend_android.o -o $@

%.o: %.c
        $(CC) -c $(INCLUDE) $(CFLAGS) $< -o $@

install: $(APP)
        $(ANDROID_SDK_ROOT)/platform-tools/adb push $(APP) $(INSTALL_DIR)/$(APP)
        $(ANDROID_SDK_ROOT)/platform-tools/adb shell chmod 777 $(INSTALL_DIR)/$(APP)

shell:
        $(ANDROID_SDK_ROOT)/platform-tools/adb shell

run:
        $(ANDROID_SDK_ROOT)/platform-tools/adb shell $(INSTALL_DIR)/$(APP)

clean:
        @rm -f $(APP).o $(APP)

我不太清楚你在这里想要实现什么。 它应该是一个标准的c程序,您希望在adb shell中使用它吗? 或者它是您希望通过普通方式从手机上使用的应用程序

关于第一个猜测,您可能应该在设备上用gdb调试程序,或者使用一些代码来打印env。似乎某个指针正在覆盖argc,或者shell没有正确设置argc


关于另一种猜测,我想说,您使用NDK的方向是错误的。了解如何使用NDK。

哇,真奇怪!你确定你没有通过任何args吗?检查IDE的选项!没有args。我不使用IDE,只在Shell中使用。我想在手机中使用它。平均而言,我直接在手机终端上运行它,它也无法获得argc值,什么会覆盖我的argc?正如lhw所说,您必须运行调试器(如gdb)来查看是什么覆盖了argc。可能是crtbegin_dynamic.o的问题?需要我自己编译crtbegin_dynamic.S并链接到我的应用程序吗?重写Android.mk文件,使用ndk_构建,应用程序没有问题,所以不应该使用这种方式!!!
Hello, world (i=3)!
**argc=33632**