如何在Android studio ndk下调试ndk

AndroidStudio环境下的jni调用(NDK)的方法
注意:如果要在AndoidStudio里面使用teminal(终端)的话,必须先配置环境变量。AS中的teminal其实和windows带的中断是一样的,只不过内嵌到了AS上。1、配置java环境变量(可以百度,配置完成必须重启teminal才能运行javac、javah等命令)。2、写好如下HelloNDK.java文件(这个文件演示了jni的调用)3、然后执行在AndoidStudio中执行Build--MakePoject,生成class文件。生成class文件放在了Poject的目录\ndk_demo_2\uild\intemediates\classes\deug\com\lcj\ndk_demo_2中,并且是隐藏的。(不查看这个文件也没关系,当然前提是执行没有错误)4、生成h文件4.1在AS的teminal输入javah,然后回车。----------------------------------------这一步可以省略,我这里将javah怎么使用。出现如下帮助文档。这里出现了javah的使用帮助。我们要用的命令是javah-ddi-classpathpath
& 果果文库所有资源均来源于互联网,仅供网友学习交流,若侵犯了您的权益,请联系我们予以删除。
13718&&人浏览
6218&&人浏览
16515&&人浏览
14889&&人浏览
19351&&人浏览
16765&&人浏览
3154&&人浏览
11281&&人浏览
6255&&人浏览
5900&&人浏览
18146&&人浏览
4087&&人浏览
9611&&人浏览
4546&&人浏览
12863&&人浏览
本文标题:AndroidStudio环境下的jni调用(NDK)的方法 链接地址:
copyright@ 2013- Inc. All Rights Reserved 果果文库 版权所有 联系站长: ; 经营许可证编号:浙ICP备号使用Android Studio 进行NDK开发和调试 - 简书
使用Android Studio 进行NDK开发和调试
尽管Android Studio已经越来越流行了,但很多人还是习惯于Eclipse或源码环境下开发JNI应用。个人认为使用Android Studio作NDK开发是必然趋势,所以本文将简单介绍如何在Android Studio上实现NDK开发。
JNI 是Java Native Inteface的缩写,是Java中定义的一种用于连接Java和C/C++接口的一种实现方式。
NDK 是 Native Developmentit的缩写,是Google在Android开发中提供的一套用于快速创建native工程的一个工具。使用这个工具可以很方便的编写和调试JNI的代码。
NDK可从或(个人网站)下载。
Gradle 是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置。
以往Android NDK开发需要在Eclipse或源码环境下,建立并配置Android.mk和Application.mk,且还要通过java命令生成.h头文件,才能编译生成so库。但在Android Studio中这些步骤都不需要,因为Gradle足够强大,只需配置Gradle即可编译生成so库。
gradle-experimental插件
在2015年5月的Google I/O大会上, Google宣布Android Studio开始支持NDK开发,通过和JetBrains的合作,将Clion整合进了Android Studio 1.3,并免费支持NDK C++开发。
同年7月,在Android Studio 1.3版本上添加了gradle-experimental插件,该插件支持NDK开发和调试,且带有代码不全和重构等高级功能。
CAVEAT: Note that this plugin is a preview of the plugin for feedback on performance and NDK integration.
The Gradle API for the new component model is not final, which means each plugin will only work with a specific version of Gradle.Additionally, the DSL may also change.
目前这个插件是预览插件,并不是正式的。意味着插件只能运行在特定的Gradle版本上。并且DSL(领域特定语言)也要改变。
使用Experimental插件进行NDK开发
使用Experimental插件的必要条件
1、Gradle-2.5或更高版本2、Android Studio 1.3 RC1或更高版本3、Android NDK r10e 或更高版本4、Build Tools 19.0.0 或更高版本
每个版本的experimental插件需要特定的Gradle版本
Plugin Version
Gradle Version
0.3.0-alpha3
0.6.0-alpha1
0.6.0-alpha5
0.7.0-alpha1
NDK开发步骤
1、新建一个Android标准工程
2、按F4打开工程配置
3、使用experimental插件需要对以下三个文件做修改:
./build.gradle
./app/build.gradle
./gradle/wrapper/gradle-wrapper.properties
./gradle/wrapper/gradle-wrapper.properties
将distributionUrl改用gradle-2.10版本
distributionUrl=https\\://services.gradle.org/distributions/gradle-2.10-all.zip
./build.gradle
使用com.android.tools.build:gradle-experimental代替 com.android.tools.build:gradle
buildscript {
repositories {
dependencies {
//classpath 'com.android.tools.build:gradle:2.0.0'
classpath "com.android.tools.build:gradle-experimental:0.7.0-alpha4"
// NOTE: Do not place your applicati they belong
// in the individual module build.gradle files
./app/build.gradle
这部分改动比较大,修改及注释如下:
// 用com.android.model.application 代替 com.android.application
apply plugin: 'com.android.model.application'
// 将原来的配置用 model{}包起来
// 取值必须使用 “=” 形式
// 否则会报 “Error:Cause: org.gradle.api.internal.ExtensibleDynamicObject” 错误
compileSdkVersion = 23
buildToolsVersion = '23.0.2'
defaultConfig {
// 取值必须使用 “=” 形式
applicationId = "com.connorlin.jnitest"
//这里要注意是 xxSdkVersion.apiLevel
// 否则会报 “Unable to load class com.android.build.gradle.managed.ProductFlavor_Impl”错误
minSdkVersion.apiLevel = 15
targetSdkVersion.apiLevel = 23
versionCode =
versionName = "1.0"
// 配置NDK
// 生成so的名字,是必须的
moduleName ="JNITest"
toolchain = 'clang'
CFlags.add('-std=c99')
// 添加依赖库
ldLibs.addAll(['android','OpenSLES', 'log'])
// 生成不同abi体系的so库
abiFilters.addAll(['armeabi', 'armeabi-v7a', 'arm64-v8a',
'x86', 'x86_64',
'mips', 'mips64'])
buildTypes {
minifyEnabled = false
// 这里注意:使用proguardFiles.add()方法
proguardFiles.add(file('proguard-rules.txt'))
4、在Java文件(这里以JNIActivity为例)中添加代码
System.loadLibrary("JNITest");
public native String testJni();
此时,native方法标红,提示如下:
在testJni()方法上按快捷键Alt + Enter,出现如下提示
按回车,会自动在main目录下生成jni文件夹,内含JniDemo.c:
#include &jni.h&
JNIEXPORT jstring JNICALL
Java_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) {
return (*env)-&NewStringUTF(env, "returnValue");
你会发现,Android Studio已经为我们自动生成JNI方法了,你只需要再写实现就可以了。
至此,最简单的NDK开发配置完毕。
其他配置,请参考,Demo可以参考
换种方式进行NDK开发
既然预览版com.android.tools.build:gradle-experimental支持NDK,那么正式版com.android.tools.build:gradle 是否也可以实现NDK开发呢?
经过实验,答案是可以的!
1、新建一个Android标准工程,并在工程设置中配置NDK路径。
2、打开 app level 的 build.gradle, 配置NDK
moduleName "NdkJniDemo"
//生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库,可忽略
然后点击右上角Sync Now, 会有如下错误提示:
按提示,在 gradl.properties 文件里加上android.useDeprecatedNdk=true即可。
3、在Java文件(这里以JNIActivity为例)中添加代码
System.loadLibrary("JNITest");
public native String testJni();
接着在testJni()方法上按快捷键Alt + Enter并回车,
同样,会自动在main目录下生成jni文件夹,内含JniDemo.c:
#include &jni.h&
但是,你会发现并不会自动生成JNI方法,这是因为使用experimental插件才会自动生成代码。
那自动生成代码该如何实现呢?
方法依然是使用gradle-experimental插件,但是不同的是,在app level的build.gradle中添加com.android.tools.build:gradle-experimental依赖。
4、在./app/build.gradle中添加gradle-experimental依赖
dependencies {
compile 'com.android.tools.build:gradle-experimental:0.7.0'
再次在testJni()方法上按快捷键Alt + Enter并回车
#include &jni.h&
JNIEXPORT jstring JNICALL
Java_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) {
return (*env)-&NewStringUTF(env, "returnValue");
你会发现成功自动生成JNI方法了。
这种方式有个副作用是 Run app 时可能会报错:
此时,只要将gradle-experimental依赖注释掉即可正常运行,同时会保持自动生成代码的功能,直到关闭工程。这样我们在需要自动生成代码的时候,将gradle-experimental依赖再次打开即可。
默认情况下是不支持NDK调试的,但要支持NDK调试也很简单,只要做些简单配置即可。
1、打开JNI调试
2、配置Android Native - Debugger
3、下载LLDB 2.0
首次底部会报错
点击 Fix,提示下载LLDB 2.0,照做,下载安装即可。
4、完成NDK调试配置,可以正常调试了。
That's all!android studio下为什么我的sdk tools 下没有 LLDB, and NDK选项? - 知乎12被浏览3417分享邀请回答01 条评论分享收藏感谢收起I am developing android app using NDK. I have two projects. One is for my native library which uses NDK and generates .so file.
I am using Android Studio but disabling auto build and enabled build using ndk-build. I am using Windows 7.
Now after generating .so file I copy those in my main application project which also uses ndk-build to compile JNI functions in which I am calling functions of my library. I hope I am clean till this point. If not then I will give more detail on request.
Now I am running my application in device using Android Studio and I can put break point in java code and debug that code but I am not able to debug JNI call and also native code which I have in separate project. I need to debug inside my library code. So is there any way to achieve this?
I have seen VisualGDB but it is paid. So let me know if there is any alternative to full fill my debugging requirements.I have searched lot but did not get any concrete solution.
I can see option in Android Studio for attaching to android process where I can see my running device but I am not sure how to use it so I can debug by native library code (which is in separate project without any activity).
Let me know if more detail is required
解决方案 In Android Studio 2.0 preview the process is a bit different (ans easier I think):
Install "LLDB": Go in Tools->Android->SDK Manager, then go in the "SDK Tools" tab and make sure to check "LLDB" (Near the end of the list usually)
Select a/the "Debug" variant: In the lower left corner of AS, click on "Build Variants", the default debug variant is called "Debug"
Select a native configuration: left side of the run button (The green triangle),The default native configuration is called "app-native"
Set a breakpoint
Launch your app in debug by clicking on the little bug on the right side of the run button.
If it doesn't work, check that your native configuration has debug type "Hybrid" selected: On the right of the play button, click the little triangle, select "Edit Configurations", select your "app-native" configuration, go in the "Debugger" tab and select "Debug type: Hybrid".
本文地址: &
我使用NDK开发Android应用程序。我有两个项目。一个是它使用NDK并生成.so文件我的本地库。我使用的Android Studio,但禁用自动构建和使用NDK,构建支持版本。我使用Windows 7。现在生成的.so文件后,我复制那些在其中也使用NDK的构建来编译在我打电话我的图书馆功能JNI功能我主要的应用程序项目。我希望我是干净的,直到这一点。如果没有,那么我会给要求更多的细节。 现在我正在使用Android的工作室我的设备应用程序,我可以把Java的code和调试中断点code,但我不能够调试JNI调用,也是本土code这我在单独的项目。我需要我的图书馆code内进行调试。那么,有没有办法做到这一点?我已经看到VisualGDB但它支付。因此,让我知道,如果有任何替代充分填补我调试requirements.I已经搜索很多,但没有得到任何具体的解决方案。我可以看到Android Studio中的选项用于连接到Android的过程中,我可以看到我跑设备,但我不知道如何使用它,所以我可以通过本机库code(这是在单独的项目没有任何调试活动)。 让我知道,如果需要更详细解决方案 在Android Studio中2.0 preVIEW的过程是一个有点不同(ANS更容易,我认为): 安装“LLDB”:走入工具 - > Android-> SDK管理器,然后再在“SDK工具”选项卡,并确保选中“LLDB”(接近列表的末尾通常情况下) 选择/“调试”变种:在AS的左下角,点击“生成变种”,默认调试版本被称为“调试” :选择本机配置:运行按钮(绿色三角形)的左侧,默认本机配置被称为“应用原生” 设置断点
通过点击运行按钮右侧的小虫子启动您的应用程序在调试 如果它不工作,请检查您的本机配置有调试型“混合”选择:在播放按钮的右侧,点击小三角,选择“编辑配置”,选择你的“应用原生”的配置,走在“调试”选项卡,选择“调试类型:混合型”。
本文地址: &
扫一扫关注官方微信& Android Studio下NDK开发该如何配置
Android Studio下NDK开发该如何配置
  1. 准备工作  在实际写代码之前,首先我们还是需要做一些准备工作:  1)下载开发包:  2)配置系统环境变量  下载好NDK开发包之后,直接解压到任意目录,然后需要配置一下系统环境变量,之所以要配置环境变量,是为了方便使用命令ndk-build脚本进行NDK编译。配置参考如下:  &&Windows系统配置   & & & &&环境变量 PATH 下追加 :D:\ProgramFile\android-ndk-r11c-windows-x86_64;  &&MacOS系统配置   & & & &&在mac系统下打开终端,输入:   & & & & &touch .bash_profile   & & & & &open -e .bash_profile   & & & & 这样会弹出一个&.bash_profile&文件.   & & & &&export ANDROID_HOME=/Users/edwin/Library/Android/sdk/   & & & & &export PATH=${PATH}:${ANDROID_HOME}ndk-bundle  2. 项目配置  使用开发前我们也要做点额外工作,我们需要在项目根目录下local.properties中添加编译NDK的路径:ndk.dir=/Users/liangqi/android-ndk  &&创建Android.mk  Android.mk文件用来指定源码编译的配置信息,例如工作目录,编译模块的名称,参与编译的文件等,大致内容如下:
LOCAL_PATH&:=&$(call&my-dir)&&
include&$(CLEAR_VARS)&&
LOCAL_MODULE&:=&hello_jni&&
LOCAL_SRC_FILES&:=&hello_jni.c&&
include&$(BUILD_SHARED_LIBRARY)&&  LOCAL_PATH:设置工作目录,而my-dir则会返回Android.mk文件所在的目录。  CLEAR&&VARS:清除几乎所有以LOCAL&&PATH开头的变量(不包括LOCAL_PATH)。  LOCAL_MODULE:用来设置模块的名称。  LOCAL_SRC_FILES:用来指定参与模块编译的C/C++源文件名。  BUILD_SHARED_LIBRARY:作用是指定生成的静态库或者共享库在运行时依赖的共享库模块列表。  &&创建Application.mk  这个文件用来配置编译平台相关内容,我们最常用的估计只是APP_ABI字段,它用来指定我们需要基于哪些CPU架构的.so文件,当然你可以配置多个平台:  APP_ABI := armeabi armeabi-v7a x86 mips  &&使用gradle脚本  当然该机器做的事我们还是尽量让机器来做,因此,接下来我打算使用build.gradle来添加一些配置,让Gradle自动帮我完成编译工作,这简直就是爽歪歪啦!  使用gradle,你再也不用手动添加Android.mk和Application.mk文件,一切在build.gradle文件中就都能搞定,在这里我们直接贴出build.gradle中ndk相关的配置:
android&{&&
&&&&compileSdkVersion&23&&
&&&&buildToolsVersion&&23.0.3&&&
&&&&defaultConfig&{&&
&&&&&&&&applicationId&&com.edwin.xxxx&&&
&&&&&&&&minSdkVersion&15&&
&&&&&&&&targetSdkVersion&23&&
&&&&&&&&versionCode&1&&
&&&&&&&&versionName&&1.0&&&
&&&&&&&&ndk{&&
&&&&&&&&&&&&moduleName&&forkApp&&//生成的so名字&&
&&&&&&&&&&&&ldLibs&&log&&//Log打印&&
&&&&&&&&&&&&abiFilters&&armeabi&,&&armeabi-v7a&,&&x86&&&&&//输出指定三种abi体系结构下的so库。目前可有可无。&&
&&&&&&&&}&&
&&&&&&&&.....................&&&
&&&&&&&&.....................&&
&&&&&&&&.....................&&
}&&&&&&  3. 补充一些Addroid调用C代码的东西(举例说明)  干货!干货!干货!  监听APP是否被卸载,遗憾的是此方法在API19以后才能使用,哎!  这段代码的原理你需要了解一下fork炸弹(fork bomb)  1)在计算机领域中是一种利用系统调用fork(或其他等效的方式)进行的服务阻断攻击;  2)与病毒与蠕虫不同的是,fork炸弹没有传染性,而且fork炸弹会使有进程/程序限制的系统无法开起新工作阶段,对于不限制进程数的系统则使之停止回应;  3)以fork炸弹为代表的自我复制程序有时亦被称为wabbit。
#include&&jni.h&&&
#include&&stdio.h&&&
#include&&unistd.h&&&
#include&&android/log.h&&&
#define&LOG_TAG&&Edwin&&&&
#define&LOGD(...)&__android_log_print(ANDROID_LOG_ERROR,&LOG_TAG,&__VA_ARGS__)&&
JNIEXPORT&void&JNICALL&&
Java_com_edwin_uninstallapp_MainActivity_uninstallListener(JNIEnv&*env,&jobject&instance)&{&&
&&&&int&code&=&fork();&&
&&&&if&(code&&&0)&{&&
&&&&&&&&&&
&&&&&&&&LOGD(&parent--&code=%d\n&,&code);&&
&&&&}&else&if&(code&==&0)&{&&
&&&&&&&&&&
&&&&&&&&LOGD(&children--&code=%d\n&,&code);&&
&&&&&&&&int&stop&=&1;&&
&&&&&&&&while&(stop)&{&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&sleep(1);&&
&&&&&&&&&&&&FILE&*file&=&fopen(&/data/data/com.edwin.uninstallapp&,&&r&);&&
&&&&&&&&&&&&if&(file&==&NULL)&{&&
&&&&&&&&&&&&&&&&LOGD(&uninstall--&code=%d\n&,&code);&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&execlp(&am&,&&am&,&&start&,&&-a&,&&android.intent.action.VIEW&,&&-d&,&&
&&&&&&&&&&&&&&&&&&&&&&&&/wp/&,&NULL);&&
&&&&&&&&&&&&&&&&stop&=&0;&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&}&else&{&&
&&&&&&&&&&
&&&&&&&&LOGD(&error--&code=%d\n&,&code);&&
本文发布:
本文地址:
发布:鸡啄米
&&( 9:55:34)&&( 10:57:35)&&( 9:57:26)&&( 11:3:54)&&( 11:2:54)&&( 10:47:42)&&( 10:12:57)&&( 9:25:55)&&( 9:18:11)&&( 10:23:26)
完全随机文章

我要回帖

更多关于 androidstudio安装ndk 的文章

 

随机推荐