2011-08-25 1 views
0

le fichier c est mytest.c:pourquoi je me trompe valeur argc dans Android app ndk?

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); 
} 

et le Makefile est:

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 [email protected] 

%.o: %.c 
     $(CC) -c $(INCLUDE) $(CFLAGS) $< -o [email protected] 

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) 

quand je lance make & & make install & & du make, le résultat est perplexe à moi:

Hello, world (i=3)! 
**argc=33632** 
+0

Wow, très étrange! Êtes-vous sûr de ne pas passer d'argument? Vérifiez les options de votre IDE! – m0skit0

+0

n'a pas d'arguments. Je ne suis pas utiliser IDE, seulement le faire en shell – kpld

Répondre

0

Je ne suis pas sûr de ce que vous essayez d'accomplir ici. Est-ce censé être un programme c standard que vous voulez utiliser dans le shell ADB? Ou est-ce une application que vous souhaitez utiliser depuis votre téléphone par des moyens normaux? En ce qui concerne la première supposition, vous devriez probablement déboguer le programme avec gdb sur le périphérique ou utiliser du code pour imprimer l'environnement. Il semble que certains pointeurs écrasent votre argc ou que le shell ne configure pas argc correctement.

En ce qui concerne l'autre supposition, je dirais que vous approchez de l'utilisation du NDK d'une mauvaise direction. Lire sur la façon d'utiliser le NDK.

+0

Je veux l'utiliser dans mon téléphone. De même, je le lance directement dans le terminal du téléphone, il ne peut pas non plus obtenir la valeur argc, ce qui écrase mon argc? – kpld

+0

Comme états lhw, vous devez exécuter un débogueur (comme gdb) pour voir ce qui écrase argc. – m0skit0

+0

peut-être le problème de crtbegin_dynamic.o? Est-ce que j'ai besoin de compiler moi-même crtbegin_dynamic.S et de créer un lien vers mon application? – kpld

Questions connexes