2017-03-31 3 views
0

Abhängig von meiner ersten question, habe ich versucht, die fanotify.h Header in meiner Anwendung zu integrieren. Die Anwendung basiert auf fsmon (eine kleine Anwendung, die fanotify syscall zu verwenden), änderte ich einige Code-Zeilen für meine Zwecke und schuf eine Android.mk Make-Datei:Android ndk Build kann nicht 32bit ausführbare Datei erstellen

APP_PLATFORM := android-23 
TARGET_PLATFORM := android-23 
LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 

# Enable PIE manually. Will get reset on $(CLEAR_VARS). This 
# is what enabling PIE translates to behind the scenes. 
LOCAL_CFLAGS += -fPIE -DHAVE_FANOTIFY=1 -DHAVE_SYS_FANOTIFY=0 
LOCAL_LDFLAGS += -fPIE -pie 

# give module name 
LOCAL_MODULE := fsmon 

# include fanotify by api 23: 
LOCAL_C_INCLUDES := /home/fabian/Android/Sdk/ndk-bundle/platforms/android-23/arch-arm/usr/include 

# include fanotify by sysroot -> 
# LOCAL_C_INCLUDES := /home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/ 

# list your C files to compile 
LOCAL_SRC_FILES := inotify.c fanotify.c util.c main.c 

# this option will build executables instead of building library for android application. 
include $(BUILD_EXECUTABLE) 

Ich brauche die linux/inotify.h und die linux/fanotify.h Header enthalten .

Auf ndk-build Ausführung nur die arm64-v8a, mips64 und x86_64 ausführbare Dateien (in libs/xxx) erhalten Ursache für folgende Fehlermeldung erstellt:

[email protected]:~/kernel_android_goldfish/fsmon/fsmon/jni$ ndk-build 
[arm64-v8a] Compile  : fsmon <= inotify.c 
[arm64-v8a] Compile  : fsmon <= fanotify.c 
[arm64-v8a] Compile  : fsmon <= util.c 
[arm64-v8a] Compile  : fsmon <= main.c 
[arm64-v8a] Executable  : fsmon 
[arm64-v8a] Install  : fsmon => libs/arm64-v8a/fsmon 
[x86_64] Compile  : fsmon <= inotify.c 
[x86_64] Compile  : fsmon <= fanotify.c 
[x86_64] Compile  : fsmon <= util.c 
[x86_64] Compile  : fsmon <= main.c 
[x86_64] Executable  : fsmon 
[x86_64] Install  : fsmon => libs/x86_64/fsmon 
[mips64] Compile  : fsmon <= inotify.c 
[mips64] Compile  : fsmon <= fanotify.c 
[mips64] Compile  : fsmon <= util.c 
[mips64] Compile  : fsmon <= main.c 
[mips64] Executable  : fsmon 
[mips64] Install  : fsmon => libs/mips64/fsmon 
[armeabi-v7a] Compile thumb : fsmon <= inotify.c 
In file included from /home/fabian/kernel_android_goldfish/fsmon/fsmon/jni/inotify.c:9: 
In file included from /home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/signal.h:49: 
In file included from /home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/linux/signal.h:21: 
In file included from /home/fabian/Android/Sdk/ndk-bundle/platforms/android-9/arch-arm/usr/include/asm/signal.h:82: 
/home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/asm-generic/signal.h:92:21: error: use of undeclared identifier 
     '__BITS_PER_LONG' 
    unsigned long sig[_NSIG_WORDS]; 
        ^
/home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/asm-generic/signal.h:25:38: note: expanded from macro '_NSIG_WORDS' 
#define _NSIG_WORDS (_KERNEL__NSIG/_NSIG_BPW) 
            ^
/home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/asm-generic/signal.h:24:19: note: expanded from macro '_NSIG_BPW' 
#define _NSIG_BPW __BITS_PER_LONG 
       ^
/home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/asm-generic/signal.h:94:3: error: typedef redefinition with different 
     types ('struct (anonymous struct at /home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/asm-generic/signal.h:91:9)' vs 
     'unsigned long') 
} sigset_t; 
^
/home/fabian/Android/Sdk/ndk-bundle/platforms/android-9/arch-arm/usr/include/asm/signal.h:20:23: note: previous definition is here 
typedef unsigned long sigset_t; 
        ^
/home/fabian/Android/Sdk/ndk-bundle/platforms/android-9/arch-arm/usr/include/asm/signal.h:84:8: error: redefinition of 'sigaction' 
struct sigaction { 
    ^
/home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/asm-generic/signal.h:101:8: note: previous definition is here 
struct sigaction { 
    ^
In file included from /home/fabian/kernel_android_goldfish/fsmon/fsmon/jni/inotify.c:9: 
In file included from /home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/signal.h:49: 
In file included from /home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/linux/signal.h:21: 
/home/fabian/Android/Sdk/ndk-bundle/platforms/android-9/arch-arm/usr/include/asm/signal.h:97:16: error: redefinition of 
     'sigaltstack' 
typedef struct sigaltstack { 
      ^
/home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/asm-generic/signal.h:111:16: note: previous definition is here 
typedef struct sigaltstack { 
      ^
In file included from /home/fabian/kernel_android_goldfish/fsmon/fsmon/jni/inotify.c:9: 
In file included from /home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/signal.h:49: 
In file included from /home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/linux/signal.h:21: 
/home/fabian/Android/Sdk/ndk-bundle/platforms/android-9/arch-arm/usr/include/asm/signal.h:101:3: error: typedef redefinition with 
     different types ('struct (anonymous struct at 
     /home/fabian/Android/Sdk/ndk-bundle/platforms/android-9/arch-arm/usr/include/asm/signal.h:97:16)' vs 'struct sigaltstack') 
} stack_t; 
^
/home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/asm-generic/signal.h:116:3: note: previous definition is here 
} stack_t; 
^
In file included from /home/fabian/kernel_android_goldfish/fsmon/fsmon/jni/inotify.c:9: 
/home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/signal.h:71:9: warning: 'NSIG' macro redefined [-Wmacro-redefined] 
#define NSIG _NSIG 
     ^
/home/fabian/Android/Sdk/ndk-bundle/platforms/android-9/arch-arm/usr/include/asm/signal.h:19:9: note: previous definition is here 
#define NSIG 32 
     ^
In file included from /home/fabian/kernel_android_goldfish/fsmon/fsmon/jni/inotify.c:9: 
/home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/signal.h:79:9: warning: 'SIGRTMIN' macro redefined [-Wmacro-redefined] 
#define SIGRTMIN (__libc_current_sigrtmin()) 
     ^
/home/fabian/Android/Sdk/ndk-bundle/platforms/android-9/arch-arm/usr/include/asm/signal.h:58:9: note: previous definition is here 
#define SIGRTMIN 32 
     ^
In file included from /home/fabian/kernel_android_goldfish/fsmon/fsmon/jni/inotify.c:9: 
/home/fabian/Android/Sdk/ndk-bundle/sysroot/usr/include/signal.h:80:9: warning: 'SIGRTMAX' macro redefined [-Wmacro-redefined] 
#define SIGRTMAX (__libc_current_sigrtmax()) 
     ^
/home/fabian/Android/Sdk/ndk-bundle/platforms/android-9/arch-arm/usr/include/asm/signal.h:59:9: note: previous definition is here 
#define SIGRTMAX _NSIG 
     ^
5 errors generated. 
    make: *** [/home/fabian/kernel_android_goldfish/fsmon/fsmon/obj/local/armeabi-v7a/objs/fsmon/inotify.o] Error 1 

Ursache inotify.c die signal.h Header enthält, die die Wieder enthält linux/signal.h und dies wiederum die platforms/android-9/arch-arm/usr/include/asm/signal.h, wo der Fehler auftritt. (plötzlich von Android-9).

Ich kann nicht herausfinden, wo das Problem ist .. Ich habe versucht, den Include-Ordner von Sysroot - aber ähnliche Fehler erscheinen.

Quelldatei: inotify.c fanotify.c

Antwort

3

Sie sollten nicht manuell in LOCAL_C_INCLUDES den NDK Header zeigen. Dies sollte automatisch hinzugefügt werden und auf die richtige Version zeigen. Nichts verwendet jedoch tatsächlich die Variablen APP_PLATFORM oder TARGET_PLATFORM hier.

Fügen Sie stattdessen APP_PLATFORM := android-23 in die Datei jni/Application.mk ein. Das sollte es mit den richtigen Plattform-Headern für alle Architekturen erstellen.

+0

Wow, vielen Dank !! Ja das war das Problem ... diese einfache Zeile war in der Application.mk notwendig. Jetzt funktioniert es! – Fabman22

1

Zusätzlich zu @ mstorsjos Antwort können Sie Unified Headers in NDK r14 und neuer verwenden. Hierbei handelt es sich um eine neue Form der Header, die immer auf dem neuesten Stand sind, anstatt für jede API-Ebene unterschiedliche Header zu verwenden.

Dies hat den Vorteil über Ihre APP_PLATFORM zu erhöhen, ist, dass Ihr APP_PLAFORM nicht höher sein kann als Ihr minSdkVersion (siehe unsere common problems doc). Da fanotify in einer ziemlich alten Version des Kernels eingeführt wurde (2.6.36 für fanotify_init), sollten Sie es immer noch mit syscall(__NR_fanotify_init) aufrufen können, obwohl die Funktion in libc in der alten Version nicht existiert. Dennoch ist ENOSYS immer eine Möglichkeit.

Standardmäßig in r14 erhalten Sie immer noch die alte Form der Header. Die neuen "Unified Header" haben die Header, nach denen Sie suchen. Wenn Sie vereinheitlichte Header ausprobieren möchten, setzen Sie APP_UNIFIED_HEADERS := true in Ihrer Application.mk (Einstellungen für andere Build-Systeme finden Sie unter dem obigen Link).

In r15 (die erste Beta wird bald fällig) hat sich der Standard in die neuen Header geändert, und die Option zum Deaktivieren wurde geändert (siehe same doc in r15).

+0

In der Tat! das ist auch ein möglicher (oder besser) Weg, beides zu tun - danke! – Fabman22

Verwandte Themen