UPDATE 2016.11.14:
目前的新版Android Studio 2.2已经可以完美支持NDK原生代码整合,通过cmake以及lldb实现c/c++代码调试,并且支持代码补全等功能!
自从Android Studio出现以后,我就很少再使用Eclipse+ADT的组合做Android开发了,更快的反应速度和更人性化的操作方式以及智能感知方面等等的优势,确实体现出了Google最初宣传Android Studio时的大部分特点,不过这些种种优势目前还只是体现在Java应用开发部分,而对于需要用到C/C++的Android NDK开发时,目前还没有很好的支持,当然,参考目前Android Studio的版本迭代速度来看,这应该也只是时间问题,当初ADT刚出的时候也是问题多多,包括后来的CDT+NDK支持,最初也只是支持原生代码的编译生成so,过了很久很久的某次update才加入了原生代码的可视化调试功能(当时也是历尽万难才测试成功的,还只是很简单的混合ndk项目…)。
最近看到了ndk又更新到了r10b版本,而且又据说新版的Android Studio中已经加入了一些ndk支持,于是正好一次测试一下(Android Studio beta 0.8.14, android-ndk32-r10b-windows-x86_64):
最初想到的用Android Studio和NDK的方式是单独编译链接JNI部分代码,然后将生成的so想办法在Android Studio的gradle生成系统中加入进去,这样就能完成最JNI操作,后来发现Android Studio项目中的app.iml文件中有这样一句:
<sourceFolder url=”file://$MODULE_DIR$/src/debug/jni” isTestSource=”false” />
发现现在的版本应该是支持管理NDK部分代码的,于是直接将jni部分代码复制到app\src\main\jni下,执行生成项目操作,得到错误提示:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ‘:app:compileDebugNdk’.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
D:\android-ndk-r10b\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=D:\Projects\…\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-19 NDK_OUT=D:\Projects\…\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=D:\Projects\…\app\build\intermediates\ndk\debug\lib APP_ABI=all
Error Code:
2
Output:
make.exe: *** No rule to make target `D:\Projects\…\app\build\intermediates\ndk\debug\obj/local/armeabi-v7a/objs/app/D_\Projects\…\app\src\main\jni’, needed by `D:\Projects\…\app\build\intermediates\ndk\debug\obj/local/armeabi-v7a/objs/app/D_\Projects\…\app\src\main\jni\main.o’. Stop.
* Try:
Run with –stacktrace option to get the stack trace. Run with –info or –debug option to get more log output.
不难看出,默认情况下,存在src/main/jni文件夹时,gradle生成脚本会执行ndk编译生成操作,但是,编译生成方式并不是像以前那样用ndk-build去处理Android.mk Application.mk等做c/c++代码的编译链接,而是在临时文件路径中重新生成了一份带有jni文件夹中所有文件绝对路径的mk文件,并以此作为ndk编译项目,姑且不说生成mk中的参数是否正确,单就是一个绝对路径问题就导致了上面提示的错误,明显mk中的source没有被正确找到(据说新版ndk是可以识别绝对路径的,不过我这还是没试验成功),然后参考最后给出的stackoverflow问答,发现可以通过在app的build.gradle中加入配置:
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir ‘src/main/libs’
}
的方式来屏蔽掉默认的jni编译生成过程,这样执行gradle生成时就不会再处理jni中的原生代码,而由手动调用ndk-build方式去生成so动态链接库,同时下面的jniLibs.srcDir重定位生成库文件夹为ndk-build默认生成的libs文件夹(这个默认是src/main/jniLibs,当然是默认生成jni脚本执行成功的话,如果想保留不变的话也可以修改一下手动执行ndk-build时的生成路径),这时再调试运行就可以正确的嵌入native库文件执行了。最后stackoverflow的链接中还给出了额外配置整合到gradle脚本中的buildNative和cleanNative方法,随IDE一起执行自定义的生成操作,保证command line正确的话性质是一样的。
UPDATE1:
经过上述设置之后虽然打包so到apk的过程没有问题了,但是如果要进行ndk-gdb调试的话,还需要进入项目属性中设置JNI调试选项(如下图),否则会提示”ERROR: Non-debuggable application installed on the target device.Please re-install the debuggable version!”,也就是没有将Debug需要的gdbserver及gdb.setup打入包内。
- JNI and Gradle in Android Studio – http://stackoverflow.com/questions/21096819/jni-and-gradle-in-android-studio
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。
你好!我现在想用android studio 进行NDK 调试,但是不知道如何调试,请求帮助!qq:2401261571 求大神指导
你好,目前的android studio还不支持NDK调试…
UPDATE1:经过上述设置之后虽然打包so到apk的过程没有问题了,但是如果要进行ndk-gdb调试的话,还需要进入项目属性中设置JNI调试选项(如下图),否则会提示”ERROR: Non-debuggable application installed on the target device.Please re-install the debuggable version!”,也就是没有将Debug需要的gdbserver及gdb.setup打入保内.ndk-gdb 如何调试呢??如何进入调试模式??
先在java部分的loadlibrary加载native .so执行后断点,然后在项目路径出执行ndk里面的ndk-gdb命令行工具,即可断在native部分。
你好:能给你联系方法吗?我的QQ号码为2401261571 能不能qq帮助一下,当我在System.loadLibrary(“helo_jni”);打断点之后执行ndk-gdb命令,出现如下的错误ERROR: Non-debuggable application installed on the target device. Please re-install the debuggable version!
好,已经加了
在哪个地方执行断点?
可以给个图文步骤吗?谢谢了
QQ1162288151
你好,没有gdbserver的问题请先手动执行ndk-build NDK_DEBUG=1方式编译一下项目JNI部分,看是否能生成gdbserver等调试用文件。关于调试的步骤,ndk原生代码调试目前Android Studio还不支持,可以直接使用NDK自带的ndk-gdb进行命令行调试或者使用ARM官方提供的DS-5社区版工具调试。
使用ndk-gdb设置断点后,怎样进入断点
进入断点是触发断点么?是的话ndk-gdb启动成功后会attach到你要调试的进程,代码执行到断点位置就能断到了。
可以给个调试jni的步骤吗?
加个QQ请教一下,1162288151
已加
要用到cygwin这个工具吗
新版本的NDK Windows版已经可以脱离cygwin环境独立运行了,用新的话就不需要
你好,我的QQ/微信是340007726 。我希望在android studio里运行一段C代码,但是这几天配置一直失败,麻烦你加一下我的QQ指导我一下,谢谢。。。已经疯了。。
我的qq是2801231306,能不能帮帮忙呢。一直不知道怎么调试gdb
好的
搜不到你给的号啊,朋友…
在吗?上线了2801231306你现在有空加下吗?谢谢
我直接给你远程控件我电脑,我弄了好久就没有成功调试jni
请问你具体是遇到了什么问题?比如报了什么错之类的。
我使用Android Studio,我的so已经放到设备上了,只是不知道怎么使用ndk-gdb,我照网上的设置了,我是在windows下的
确认JNI部分生成的是debug的so并且apk包中存在gdbserver的话直接在项目文件夹中执行ndk中的ndk-gdb就可以了
哥们,有试过使用AS+NDK编译可执行程序么?现在的AS已经升级到1.2.1.1了。src/main/jni/Android.mk 里面,这文件貌似沦为只是个辅助的编译脚本了。而指定需要编译哪些模块,必须在 build.gradle 的 android { ndk { moduleName “xxx” }} 来指定。但是指定的 xxx 名字是动态库的名字,生成的文件会自动在这个名字前后加上 lib 和 .so 的前后缀。想编译生成一个可执行的 NDK 项目,有什么思路么?
你好,Android Studio在我写这篇记录的时候就是没有像Eclipse那样直接调用ndk-build编译项目jni文件夹中的原生代码。看来新版本的又更进一步无视mk的方式了,可以试试屏蔽build.gradle中的默认jni处理逻辑,然后加入调用命令行ndk-build的方式在jni中执行mk编译,可以参考我上面写的方法。
jni 调试进不去, None of the 1 split apks are compatible with the current device with density 480 and abis armeabi-v7a, armeabi.搞不清楚是什么原因,能帮我看看么? 我的Q是:741227905,多谢了!
不调试的话程序能运行么?
你好,请问知道如何在android studio断点调试c++代码呢?还是AS不支持?能否加q聊聊,309190656
你好,AS目前的版本,至少是我写这篇博文的时候是不支持调试原生代码的,一直在改进的也只是能顺便完成ndk-build的原生代码编译打包so进apk的工作。如果需要可视化调试android ndk代码的话建议使用VS+Visual GDB完成,可以接受命令行模式的话直接用ndk自带的ndk-gdb就可以。
我发现在AS里可以安装plugin,其中就有C/C++插件,这个是否有帮助?
那个应该是IntelliJ IDE的C/C++插件,作用类似Eclipse的CDT,如果没有针对Android NDK平台的功能的话,也只是可以让IDE支持C/C++代码编辑的功能,比如智能感知、重构一类的操作。
谢谢,我上google groups再查查
不客气
我设置debugable=true后,libs里面没有生产gdbservice文件。是什么问题呢,还有哪里需要配置的?
具体调试步骤是什么呢?
秒赞不是偶然,是一种态度!
可否指点一下我啊大师 290572333 QQ/微信
我想用android studio 直接debug jni 但是不行,后又用VS2005+android studio还是不行,好苦恼。。。
你好,请问具体是什么问题?
加个QQ请教一下,89579416
你好,请问是什么问题?
你的项目中都有ndkBuild,我的项目中怎么没有
ndkBuild?是ndk-build么?那是Android NDK中的编译脚本
就是在右边Gradle里面的,我的打开了怎么没有找到ndkBuild
我这也没有ndkBuild啊
我把你的项目下载下来了,并添加到我的代码里面,运行之后在MainActivity的41行报错
java.lang.UnsatisfiedLinkError: Native method not found: com.facsimilemedia.OpenCVHelper.gray:
at com.facsimilemedia.MainActivity$1.onClick(MainActivity.java:41)
朋友,你是不是找错地方了?我没提供过什么项目的下载啊。
啊,那不好意思,谢谢你陪我聊了这么久,现在己配置好了,感谢
[ok]没事,不必客气
你好,由于使用的第三方sdk只提供了armeabi和x86两个平台下的so文件,所以对其他第三方sdk也只保留了这两个平台下的so,在使用compile ‘com.facebook.fresco:fresco:0.8.1’集成fresco的时候,由于fresco包含了armeabi-v7a、x86_64平台下的so,所以导致在armeabi-v7a手机上找不到其他第三方so文件,报java.lang.UnsatisfiedLinkError错误,请问怎么配置能在打包的时候只打包armeabi和x86两个平台下的so文件。QQ 632689688 望指教万分感谢
你好,在jni的Application.mk里指定APP_ABI,比如arm和armv7a是”APP_ABI := armeabi armeabi-v7a”,关于ABI的详细说明可以看这里:http://developer.android.com/intl/zh-cn/ndk/guides/abis.html
已经找到解决办法,谢谢
[赞]不客气
你好,请问最后是怎么解决的吗?
在吗 加个qq 704178824,请教关于jni的问题
你好,请问是什么问题?
Error:(452) undefined reference to `AAsset_openFileDescriptor’
Error:error: ld returned 1 exit status
Error:Execution failed for task ‘:app:compileDebugNdk’.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘C:UsersCrazyBoaDownloadsandroid-ndk-r10endk-build.cmd” finished with non-zero exit value 2博主,我用别人的项目,总报这个错误,是什么问题,博主有空能不能回答我一下,谢谢啦
你好,看下link时参数有没有-landroid,这是AAsset_openFileDescriptor符号所需的lib
你说的是Android.mk里的参数吗
报这个错误的jni项目的build设置,一般是android.mk
嗯嗯,因为是别人的项目,已经写好了android.mk的这个文件,我要去改吗,怎么改
参考下ndk里的例子吧:native-activity
嗯嗯好,谢谢博主
不客气
博主加个qqYpabnZdnZWiUZQ==,给博主赞赏一下
已加
大神,在吗?我抱着侥幸心理希望大神能看到,我想请教个问题,能加QQ790562947么,急啊
你好,请先描述下你遇到的问题,谢谢
就是我现在自己那个jni文件下面那个.h文件中#include<jni.h>一直报红,我在网上找了好久,有的说是要导入ndk,我导入了可是他还是报错,翻译后:
错误:执行失败的任务“myapplication:compileDebugNdk”。
> com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException:过程‘命令’D: android-ndk64-r10-windows-x86_64 android-ndk-r10 ndk-build。cmd”完成了非零退出值2
怎么就成这样了呢?求指教一下啊
这个先手动执行一下命令行ndk-build,看看具体提示的是什么错误,看现象可能是ndk环境没有配置正确,也可以直接用ndk里的samples编译下看是否有问题。
louzhu还在吗?能帮我看看这个问题吗?谢谢
你好,请问是什么问题?
https://www.zhihu.com/question/46030424?from=profile_question_card
能加下你QQ吗?大哥
我这问题非常急,或者你加下我吧3010234291,救命
不好意思,gradle脚本我也不是很熟悉…
是这样的,我没在脚本中声明ndk的moduleName,想使用android.mk里面配置的NAME。但是照你设置了sourceSets.main后,生成的so文件名字并不是android.mk里面设置的名字,是不是代表没有读取.mk文件?.
嗯,按我写这篇文章时的情况看,应该是AS自己处理了.mk中的参数,所以不清楚gradle中ndk相关设置的情况下,建议还是单独编译jni部分吧,至少.mk资料多些
您好,我这个项目是公司之前同事用 eclipse写的,现在想转到AS,但是通过AS导入eclipase项目后,里面就一直报错,麻烦能不能加一下QQ帮看一下
错误提示信息:
Error:In file included from E:ASMyWorkspaceUserTextautostartLibraryCppsrcmainjnicommoncommon.c:11:0:
D:/AS/androidstudio/androidNDK/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/include-fixed/stdio.h:50:23: fatal error: sys/cdefs.h: No such file or directory
compilation terminated.
make.exe: *** [E:ASMyWorkspaceUserTextautostartLibraryCppbuildintermediatesndkreleaseobj/local/armeabi-v7a/objs/autostartLibraryCpp/E_ASMyWorkspaceUserTextautostartLibraryCppsrcmainjnicommoncommon.o] Error 1
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ‘:autostartLibraryCpp:compileReleaseNdk’.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘D:ASandroidstudioandroidNDKandroid-ndk-r9dndk-build.cmd” finished with non-zero exit value 2
* Try:
Run with –stacktrace option to get the stack trace. Run with –info or –debug option to get more log output.
还有一个警告:
Warning:Native C/C++ source code is found, but it seems that NDK option is not configured. Note that if you have an Android.mk, it is not used for compilation. The recommended workaround is to remove the default jni source code directory by adding:
我在网上差了很多方法也没解决
我的QQ 534631352
我加了 sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir ‘src/main/libs’
} 但是 还是有那个警告
警告:本机C / C++源代码是找到了,但似乎没有配置NDK选项。注意,如果你有一个Android.mk,它不是用来编译。建议的解决方法是通过添加删除默认的JNI的源代码目录:
你好,先说刚才的编译问题,eclipse下是不会报错的么?或者建议先用ndk-build手动编译一下项目中的jni部分,看看有没有问题
eclipse不报错 这个项目 都已经上线了
Execution failed for task ‘:autostartLibraryCpp:compileReleaseNdk’.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘D:ASandroidstudioandroidNDKandroid-ndk-r9dndk-build.cmd” finished with non-zero exit value 2
返回值 为2 是什么意思呀 我对 eclipse不怎么懂 也不知道 之前是怎么写的
这个是ndk-build报错了,就是刚才我说的手动编译一下jni部分,看看有没有问题,我写的这个方法其实就是不让AS内置的ndk功能进行原生代码编译,因为当时我用的版本这个功能很不完善,不知道现在的2.x是不是改进了。所以你必须保证ndk环境以及直接ndk-build你的项目时没有问题。
你好,我也遇到NDK的问题,能否帮忙解决下吗?如果你方便的话 请你加我的qq:954943214
你好,请问是什么问题?
大神,怎么解决 呢
怎么处理这个问题的,大神