【问题标题】:Android NDK includesAndroid NDK 包括
【发布时间】:2014-01-13 09:15:29
【问题描述】:

假设我的 Android 项目使用具有下一个结构的 jni:

jni__
     |__src__
             |__first.c
             |__second.c
             |
             |__include__
                         |__first.h

src目录下有两个源文件,src/include目录下有一个头文件。

first.h:

#include <string.h>

#ifndef FIRST_H
#define FIRST_H

extern char * text();

#endif

first.c:

#include "first.h"

char * text() {
    ...
    return ...;
}

second.c:

#include "first.h"
#include <jni.h>

jbyteArray Java_com_example_android_MainActivity_getText( JNIEnv*  env, jobject this) {
    char * str = text();
    ...
    return str;
}

如何编译此源码并正确指定Android.mk文件中带有头文件的目录?

现在我的 Android.mk 文件如下:

LOCAL_PATH:= $(call my-dir)

LOCAL_SRC_PATH := $(LOCAL_PATH)/../src

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src/include

include $(CLEAR_VARS)

LOCAL_MODULE    := mylib
LOCAL_SRC_FILES := $(LOCAL_SRC_PATH)/first.c \
                    $(LOCAL_SRC_PATH)/second.c

include $(BUILD_SHARED_LIBRARY)

但是当我尝试构建这个源代码时,编译因错误而终止:"first.h: No such file or directory".

【问题讨论】:

    标签: android android-ndk include java-native-interface


    【解决方案1】:

    LOCAL_C_INCLUDES := $(LOCAL_PATH)/src/include 应该这样做。如您可以在 NDK 目录中找到的 NDK 文档中的 ANDROID-MK 文件中所述,$(LOCAL_PATH) 是指您的 Android.mk 文件所在的目录。假设它位于 jni 目录下,$(LOCAL_PATH)/src/include 指向你丢失文件所在的头目录。

    根据使用标头的一般约定,我会使用#include &lt;first.h&gt; 而不是#include "first.h"

    【讨论】:

    • 不幸的是 $(LOCAL_PATH)/src/include 也不起作用。我不确定 $(LOCAL_PATH) 指的是哪里,但 LOCAL_SRC_PATH := $(LOCAL_PATH)/../src 指的是 jni/src 目录。
    • 在您的模块中添加 LOCAL_C_INCLUDES。我的意思是,在包含 $(CLEAR_VARS) 之后和之前包含 $(BUILD_SHARED_LIBRARY)
    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 2013-02-28
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多