【问题标题】:Android NDK Make File and Maven Build IssuesAndroid NDK 生成文件和 Maven 构建问题
【发布时间】:2016-07-29 16:57:15
【问题描述】:

我只想说我对 Android NDK 还很陌生,所以我一直在尝试阅读有关它的 Android 文档。尝试在 Maven 中使用它(通过插件)时,我遇到了一些问题。下面是我的 Maven 插件 sn-ps 以及我的 Android.mk 文件。

pom.xml(插件部分):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <compilerArgument>-AguiceAnnotationDatabasePackageName=my.package.name</compilerArgument>
        <fork>true</fork>
    </configuration>
</plugin>
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>native-maven-plugin</artifactId>
    <version>1.0-alpha-8</version>
    <executions>
        <execution>
            <goals>
                <goal>javah</goal>
            </goals>
            <phase>compile</phase>
            <configuration>
                <javahClassNames>
                    <javahClassName>my.package.name.MyClass</javahClassName>
                </javahClassNames>
                <javahVerbose>true</javahVerbose>
                <javahPath>$(THE_JAVA_PATH)\bin\javah.exe</javahPath>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>com.simpligility.maven.plugins</groupId>
    <artifactId>android-maven-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
        <manifest>
            <debuggable>true</debuggable>
            <usesSdk>
                <minSdkVersion>17</minSdkVersion>
                <targetSdkVersion>18</targetSdkVersion>
            </usesSdk>
        </manifest>
        <apk>
            <debug>true</debug>
        </apk>
        <extractDuplicates>true</extractDuplicates>
        <dex>
            <coreLibrary>true</coreLibrary>
            <jvmArguments>
                <jvmArgument>-Xmx2048m</jvmArgument>
            </jvmArguments>
        </dex>
        <nativeLibrariesDirectory>${to.ndk.libs}</nativeLibrariesDirectory>
        <ndkOutputDirectory>${to.ndk.objs}/local</ndkOutputDirectory>
    </configuration>
</plugin>
<plugin>
    <groupId>com.simpligility.maven.plugins</groupId>
    <artifactId>android-ndk-maven-plugin</artifactId>
    <version>1.0.1-SNAPSHOT</version>
    <executions>
        <execution>
            <goals>
                <goal>ndk-build</goal>
            </goals>
            <configuration>
                <target>${project.artifactId}</target>
                <finalLibraryName>${project.artifactId}</finalLibraryName>
                <ndkPath>$(THE_NDK_PATH)</ndkPath> 
                <makefile>jni/Android.mk</makefile>
                <applicationMakefile>jni/Application.mk</applicationMakefile>
                <architectures>${arch}</architectures>
                <additionalCommandline>${ndk.args}</additionalCommandline>
                <librariesOutputDirectory>${to.ndk.libs}</librariesOutputDirectory>
                <objectsOutputDirectory>${to.ndk.objs}</objectsOutputDirectory>
                <headerFilesDirectives>
                    <headerFilesDirective>
                        <directory>${basedir}/jni</directory>
                        <includes>
                            <include>**\/*.h</include>
                        </includes>
                    </headerFilesDirective>
                    <headerFilesDirective>
                        <directory>${project.build.directory}/native/javah</directory>
                        <includes>
                            <include>**\/*.h</include>
                        </includes>
                    </headerFilesDirective>
                </headerFilesDirectives>
            </configuration>
        </execution>
    </executions>
</plugin>

我的目录结构如下 MyRoot -> jni -> (c/cpp files)。当然还有 java 文件的标准目录结构。我的 Android.mk 文件如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := my-lib

LOCAL_SRC_FILES := MyClass1.cpp \
     MyFile1.c \
     MyClass2.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH) \
    $(LOCAL_PATH)/../target/native/javah

LOCAL_LDLIBS    := -llog
LOCAL_CPP_FEATURES := rtti exceptions

LOCAL_CFLAGS += \
    -D _NX_FEATURE_ATOMIC_C_PLUS_PLUS_11_ \
    -D _NX_FEATURE_CAN_BUS_INTERFACE_ROUTER_ \
    -D _NX_FEATURE_CAN_BUS_CREATED_BY_CONFIGURATION_ \
    -D _NX_FEATURE_CAN_BUS_TC_SERVICE_ \
    -D _NX_FEATURE_CRC_ \
    -D _NX_FEATURE_EXCEPTIONS_ \
    -D _NX_FEATURE_FILE_SUPPORT_CRT_ \
    -D _NX_FEATURE_FLOAT_64_ \
    -D _NX_FEATURE_LOG_ \
    -D _NX_FEATURE_MUTEX_PTHREAD_ \
    -D _NX_FEATURE_POSIX_SIGNAL_HANDLER_ \
    -D _NX_FEATURE_RANDOM_ \
    -D _NX_FEATURE_SECURITY_UNSET_INTENTIONALLY_ \
    -D _NX_FEATURE_THREAD_ \
    -D _NX_FEATURE_TRACE_STDIO_ \
    -D _NX_FEATURE_TCP_IP_ \
    -D _NX_FEATURE_XML_PARSER_ \
    -D NX_CUSTOMER_FAR \
    -D __STDC_FORMAT_MACROS
    -D HAVE_FTRUNCATE=1 \
    -D HAVE_GETCWD=1 \
    -D HAVE_GETPAGESIZE=1 \
    -D HAVE_GETTIMEOFDAY=1 \
    -D HAVE_INTTYPES_H=1 \
    -D HAVE_MALLOC=1 \
    -D HAVE_MEMCHR=1 \
    -D HAVE_MEMMOVE=1 \
    -D HAVE_MEMORY_H=1 \
    -D HAVE_MEMSET=1 \
    -D HAVE_MKDIR=1 \
    -D HAVE_MMAP=1 \
    -D HAVE_MUNMAP=1 \
    -D HAVE_NETDB_H=1 \
    -D HAVE_PTRDIFF_T=1 \
    -D HAVE_RMDIR=1 \
    -D HAVE_SELECT=1 \
    -D HAVE_SOCKET=1 \
    -D HAVE_STDDEF_H=1 \
    -D HAVE_STDINT_H=1 \
    -D HAVE_STDLIB_H=1 \
    -D HAVE_STRINGS_H=1 \
    -D HAVE_STRING_H=1 \
    -D HAVE_STRPBRK=1 \
    -D HAVE_STRRCHR=1 \
    -D HAVE_STRSPN=1 \
    -D HAVE_STRTOUL=1 \
    -D HAVE_STRTOULL=1 \
    -D HAVE_SYS_PARAM_H=1 \
    -D HAVE_SYS_SOCKET_H=1 \
    -D HAVE_SYS_STAT_H=1 \
    -D HAVE_SYS_TIME_H=1 \
    -D HAVE_SYS_TYPES_H=1 \
    -D HAVE_TERMIOS_H=1 \
    -D HAVE_UNISTD_H=1

LOCAL_STATIC_LIBRARIES := $(ANDROID_MAVEN_PLUGIN_LOCAL_STATIC_LIBRARIES)    
LOCAL_SHARED_LIBRARIES := $(ANDROID_MAVEN_PLUGIN_LOCAL_SHARED_LIBRARIES)

include $(BUILD_SHARED_LIBRARY)

# Important: Must be the last import in order for Android Maven Plugins paths to work
include $(ANDROID_MAVEN_PLUGIN_MAKEFILE)

所以我得到的错误如下:

...\android-ndk-r10e\ndk-build.cmd -C ...\MyRoot APP_BUILD_SCRIPT=jni/Android.mk NDK_APPLICATION_MK=jni/Application.mk NDK_TOOLCHAIN=x86_64-4.9 APP_ABI=x86_64 V=1 -B NDK_DEBUG=1 NDK_LIBS_OUT=...\MyRoot\target\ndk-libs NDK_OUT=...\MyRoot\target\ndk-obj MyRoot

make.exe: *** No rule to make target `MyRoot'.  Stop.

我不确定为什么要使用 MyRoot。当我在没有“MyRoot”的情况下手动执行命令时,构建过程开始,但它似乎没有使用我的 Android.mk 文件 (LOCAL_C_INCLUDES) 中列出的任何包含文件。

这可能有点傻,但我在这里迷路了。任何帮助表示赞赏。

【问题讨论】:

    标签: maven compilation android-ndk build-process


    【解决方案1】:

    在您的命令结束时,您有一个浮动的“MyRoot”。我很确定删除它会解决此错误。

    ...\android-ndk-r10e\ndk-build.cmd -C ...\MyRoot \
    APP_BUILD_SCRIPT=jni/Android.mk NDK_APPLICATION_MK=jni/Application.mk \
    NDK_TOOLCHAIN=x86_64-4.9 APP_ABI=x86_64 V=1 -B NDK_DEBUG=1 \
    NDK_LIBS_OUT=...\MyRoot\target\ndk-libs \
    NDK_OUT=...\MyRoot\target\ndk-obj MyRoot # this MyRoot is unnecessary
    

    如果您的 Application.mk 和目录结构设置正确,您还会发现其中许多选项(APP_ABI、NDK_TOOLCHAIN 等)都是不必要的。

    【讨论】:

    • 是的,这就是问题所在。我提到如果我删除它,除了包含错误之外它还可以工作。使用 Maven 和 Android.mk 我如何自动摆脱它?这需要自动化
    • 抱歉,不清楚您要删除哪个“MyRoot”。如果您删除“MyRoot”,您可以发布您遇到的错误吗?
    • 它只是编译错误,因为它没有查看 LOCAL_C_INCLUDES 中的头文件。我认为这是下一步,但现在如果我能在自动构建过程结束时得到那个 MyRoot 会很好
    • 我认为插件或 .mk 文件中的某些内容我做错了。
    猜你喜欢
    • 1970-01-01
    • 2013-08-16
    • 2014-05-21
    • 2012-08-05
    • 2012-03-30
    • 1970-01-01
    • 2019-04-25
    • 2017-05-23
    • 1970-01-01
    相关资源
    最近更新 更多