我的问题超出了标题所说的内容,因此会在问题出现之前给出背景信息。自从我从Android Studio 1.5更新到2.0(现在使用2.1.1稳定版,尝试过测试版)以来,我一直在试验问题
背景
当我更新我的Android Studio并在NDK中打开c文件时,我开始收到以下消息: 即使我已同步项目,也会显示此消息。
编译器工作正常,因为我可以忽略修改c中的东西,它仍然可以编译。然后我尝试添加一个由我创建的文件的新包含,其中包含一些设置和方法,同一文件包含在其他文件中运行良好。但是,这次编译器抛出了以下错误:
error: undefined reference to 'my_method'
花了很长时间调试但是没有成功,所以决定迁移到实验gradle,这个问题不会发生。
以下是我现在使用的内容: - gradle-experimental:0.7.0 - wraper:gradle-2.10-all.zip
我的gradle文件是:
apply plugin: 'com.android.model.application'
import org.apache.tools.ant.taskdefs.condition.Os
model {
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig.with {
applicationId "com.domain.myapp"
minSdkVersion.apiLevel 15
targetSdkVersion.apiLevel 23
versionCode 1
versionName "1.0"
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
task ndkBuild(type: Exec) {
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath
}
}
}
task runSwig(type: Exec, description: 'Run swig config') {
workingDir 'src/main'
commandLine 'cmd', '/c', 'swig.bat'
}
ndk {
moduleName "MyNativeModule"
//toolchain "clang"
}
sources.main {
jni {
source {
srcDir 'src/main/libs' //set .so files location to libs
srcDirs = [] //disable automatic ndk-build call
}
}
}
buildTypes {
debug {
debuggable true
ndk.with {
debuggable = true
}
versionNameSuffix "1.0"
}
}
}
repositories {
maven { url "https://jitpack.io" }
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
compile 'org.litepal.android:core:1.2.1'
}
现在,当我运行干净时,它成功完成,但是......
现在出现问题:
*我正在使用libusb库 当我尝试构建时,出现以下错误:
-Error:(20, 20) config.h: No such file or directory
-Error:(33, 30) libkern/OSAtomic.h: No such file or directory
-Error:(29, 25) dev/usb/usb.h: No such file or directory
... many others like these
对于库中的config.h,它包括如下:
#include <config.h>
因为我将该文件放在库的父目录中,所以我设法让它以这种方式工作:
#include "../config.h>
另一方面,对于其他文件,我没有库中的目录和文件,所以我不能引用它们。此外,当我谷歌时,我看到这些文件属于MacOS。
使用标准gradle这不是一个问题,因为它像魅力一样编译!
我的问题是:
我已尝试过的内容:
当我熟悉NDK和C时,我的问题可能是obvios,任何帮助都会非常感激!
更新
我正在构建libusb库,因为我对它进行了一些更改。 (使用稳定的gradle这个工作正常,除了我上面描述的问题,在更新之前我已经使用这个设置几个月,一切都按预期工作)
我的目录结构如下:
-jni
-jni/myUSB/libusb
以下是我的Android.mk文件,以便您了解我是如何构建它们的: JNI:
LOCAL_PATH := $(call my-dir)
ROOT_PATH := $(LOCAL_PATH)
include $(call all-subdir-makefiles)
LOCAL_PATH := $(ROOT_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE := myModuleName
LOCAL_CFLAGS := -O2 -ffast-math
LOCAL_LDLIBS := -llog
LOCAL_SRC_FILES := \
jiw.cpp \
mainFile.c \
otherFile.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/
LOCAL_SHARED_LIBRARIES := myUSB
include $(BUILD_SHARED_LIBRARY)
myUSB:
LOCAL_PATH := $(call my-dir)
ROOTUSB_PATH := $(LOCAL_PATH)
include $(call all-subdir-makefiles)
LOCAL_PATH := $(ROOTUSB_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE := myUSB
LOCAL_CFLAGS := -O2 -ffast-math
LOCAL_LDLIBS := -llog -pthread
LOCAL_SRC_FILES := \
myUsbMainFile.c \
myUsbInterface.c \
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/
LOCAL_SHARED_LIBRARIES := android-usb
include $(BUILD_SHARED_LIBRARY)
libusb的:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := android-usb
LOCAL_CFLAGS := -O2 -ffast-math
LOCAL_LDLIBS := -llog
LOCAL_SRC_FILES := \
core.c \
descriptor.c \
io.c \
sync.c \
os/linux_usbfs.c \
os/threads_posix.c \
os/android_java.c
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/ \
$(LOCAL_PATH)/os
include $(BUILD_SHARED_LIBRARY)