我正在尝试将原生代码添加到我的应用中.我../main/jni在Eclipse项目中拥有所有内容.我加入ndk.dir=...了我的local.properties.我还没有做任何其他事情(我不确定还有什么需要,所以如果我错过了什么让我知道).当我尝试构建时,我收到此错误:
Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
/Users/me/android-ndk-r8e/ndk-build NDK_PROJECT_PATH=null
APP_BUILD_SCRIPT=/Users/me/Project/app/build/ndk/debug/Android.mk APP_PLATFORM=android-19
NDK_OUT=/Users/me/Project/app/build/ndk/debug/obj
NDK_LIBS_OUT=/Users/me/Project/app/build/ndk/debug/lib APP_ABI=all
Error Code:
2
Output:
make: *** No rule to make target `/Users/me/Project/webapp/build/ndk/debug//Users/me/Project/app/src/main/jni/jni_part.cpp',
needed by `/Users/me/Project/app/build/ndk/debug/obj/local/armeabi-v7a/objs/webapp//Users/me/Project/app/src/main/jni/jni_part.o'.
Stop.
Run Code Online (Sandbox Code Playgroud)
我需要做什么?
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# OpenCV
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include .../OpenCV-2.4.5-android-sdk/sdk/native/jni/OpenCV.mk
LOCAL_MODULE := native_part
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
Application.mk:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM …Run Code Online (Sandbox Code Playgroud) java-native-interface android gradle android-ndk-r7 android-studio
Clean Project和Rebuild Project(在Android Studio中)有什么区别?
R file关于about 的问题res ids,所以我将文件扩展名更改gif为png,然后[我的构建失败.]Rebuild Project.这提示我上面的问题.我正在尝试使用Android Studio 1.3.1使用实验gradle语法编译NDK项目.
我的build.gradle外表非常像茶壶的例子
除了我的源代码树有一些我不想包含在构建中的文件.我无法删除这些文件,所以我需要gradle来忽略它们.
我尝试添加一个exclude定义:
android.sources {
main {
jni {
source {
srcDirs 'src/main/jni'
excludes += "src/main/jni/FileToExclude.cpp"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这并没有影响结果.gradle仍然尝试编译此文件.
我想excludes,exclude与=,+=与什么都没有,但没有别的置换工作.
我的应用程序有几个JNI模块.我使用Android.mk来定义模块以及为每个模块构建的文件.所以我不得不禁用自动ndk-build调用.我的gradle包含以下内容:
sourceSets.main {
jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk file
jniLibs.srcDirs = ['src/main/libs']
}
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
commandLine "ndk-build.cmd",
'-C', file('src/main/jni').absolutePath,
'-j', Runtime.runtime.availableProcessors(),
'all'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn buildNative
}
Run Code Online (Sandbox Code Playgroud)
从现在开始Android Studio支持NDK和本机调试,我需要使用新的实验gradle插件.我需要一个部分来指定模块名称.
android.ndk {
// All configurations that can be changed in android.ndk.
moduleName = "native"
toolchain = "clang"
toolchainVersion = "3.5"
// Note that CFlags has a capital C, which is inconsistent with
// the naming …Run Code Online (Sandbox Code Playgroud) 我的项目中有一个PDFViewer模块,具体取决于android库模块libPDF.本机代码包含在库模块(在jni文件夹中)以及相应的android代码中.我正在使用Gradle实验0.3.0-alpha4(与0.2.0和0.2.1相同的问题).文件jni夹外部的库中有本机文件- 它们包含在内android.sources,其标题包含CFlags在中android.ndk.该库被编译成.so文件并包含在apk中.
该项目使用PDFViewer的默认调试本机配置进行编译和运行,调试器以警告启动:
注意!找不到符号目录 - 请检查您的本机调试配置.
调试时,本机代码(和Java代码)中没有断点.如果我暂停调试器,则执行在一个名为的函数中epoll_wait.
我不知道这是否重要,但在Android Studio 1.3.2中我得到了
Throwable:找不到LLDB服务器
在事件日志中.如果我尝试使用GDB,它也会引发异常.我只建造了armaebi-v7a版本.在给定的示例中,我没有看到任何特殊的gradle代码来包含本机代码的调试信息.或者我错过了什么?
我是否需要自己从本机配置选项添加符号目录?这些目录是什么以及如何找到它们?调试时示例示例不显示此警告,并且在其本机配置选项中未设置符号目录.
debuggable,jniDebuggable,ndk.debuggable标志设置为true,android:debuggable = true在清单中,CFlags += "-g"是在ndk块,所有这些工作.
有任何想法吗?提前致谢.
编辑: 这是一个Github链接,其中包含我编写的示例示例以向您显示问题.如果您尝试使用本机配置调试库中的本机代码,则不会触发任何断点.
新的Gradle实验0.3.0-alpha6无法解决问题.其他人也有这个问题.gradle插件仍然是alpha版本,因此库的原生调试仍然没有实现?
android android-ndk android-debug android-studio android-gradle-plugin
花了几个小时寻找我的问题的解决方案并浏览各种论坛(包括这个论坛)后,我终于决定问我的问题,希望它在其他地方没有完全回答.
我正在尝试构建一个非常复杂的架构:
我首先成功完成了以下测试 - 我已经设法创建了一个没有NDK的模块库,并使用该应用程序进行编译. - 我还设法直接在应用程序中使用静态库和JNI
我没有通过以下步骤: - 模块内部的JNI和调用模块类的app的组合不起作用.
我认为问题在于aar的包含,因为当aar位于库构建/输出目录中时,我无法在我的应用程序的构建目录中找到爆炸的aar.此外,所有以前的测试(包括使用JNI都是成功的).
我没有使用实验模型,因为它是实验性的,静态库存在已知的局限性.
我的项目结构是:
- App
- src
- main
- java
- activity
- bar
- src
- main
- java
- class
- jni
- include
- *.h
- libs
- abis...
- libmod1.a
- libmod2.a
Android.mk
Application.mk
bar.c
bar.h
Run Code Online (Sandbox Code Playgroud)
app build.gradle看起来像这样:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
defaultConfig {
applicationId "com.test.foo"
minSdkVersion 10
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes { …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一个巨大的跨平台C++ 11(iOS + Android)应用程序项目迁移到Android Studio 14.我使用CrystaX NDK进行boost和C++ 14.有在其网站上的博客的官方Android工作室+ CrystaX教程在这里,但它是过时的.
我已经下载了官方的hello-jni示例,该示例旨在与Android Studio 1.4一起使用,并尝试使其适应与CrystaX NDK一起使用.这些是我的Gradle 2.5设置:
project build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.2.0'
}
}
allprojects {
repositories {
jcenter()
}
}
Run Code Online (Sandbox Code Playgroud)
module build.gradle
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.1"
defaultConfig.with {
applicationId = "com.tableair.app"
minSdkVersion.apiLevel = 4
targetSdkVersion.apiLevel = 23
}
}
compileOptions.with …Run Code Online (Sandbox Code Playgroud)