详解如何使用VisualStudio高效开发调试AndroidNDK

本文介绍了如何使用VisualStudio高效开发调试AndroidNDK,分享给大家,具体如下:

场景

  1. 场景一:Java层代码与SO的开发分为不同的程序猿负责,开发SO的时候基本上APK的其他文件不会修改。
  2. 场景二:主要代码就是C++,Java层代码也只是个DEMO,Java代码基本没啥修改。

常见的做法是:
1. 使用编辑器或者编译器编写C++代码。
2. 使用NDK命令编译SO。
3. 重新打包APK,或者直接替换APK中的SO文件再重签名。
4. 安装到手机。
5. 运行。
6. 崩溃。
7. 排错。

如此往复,有限的时间和精力在无限的编译和调试之中全部都耗完。

当然会问:为啥不用AndroidStudio自带的NDK开发,试过,不好用。这里推荐一种方法,搭建很简单,使用起来很方便又节省时间,分享给大家。

步骤

以vs2008为例(高版本亦可,不知道vs2017是不是对NDK开发支持的很好了,一直没敢尝试)

新建VS解决方案,添加源码

新建一个空的解决方案,然后把自己编写的c++的头文件和源文件都添加进来。

设置VS工程属性

项目属性“常规”-“配置类型”修改为“生成文件”:

添加头文件包含,启动自动代码完成

这里主要是把NDK开发的include目录包含进来, 打开vs“工具”-“选项”-“项目和解决方案”-“VC++目录”,设置包含文件目录新增“D:\ndk\platforms\android-19\arch-x86\usr\include”:

手动把D:\ndk\platforms\android-19\arch-x86\usr\include目录下的jni.h拖入VS中打开,此时VAX开始自动索引,这时候JNI开发相关的关键字便可以正常识别了。使用自动提示写起来就比较快速,而且也不容易出错。

配置自动化脚本

其中build.bat脚本:

set dir=%~dp0
set modulename=test
set modulefile=..\libs\armeabi\lib%modulename%.so
cd /d %dir%
call ./ndk.bat
if exist %modulefile% (
 copy %modulefile% ..\main\jniLibs\armeabi\lib%modulename%.so
 call ./debug.bat com.bigsing.hooktest
)

编译成功后会根据JNI在AndroidStudio项目工程的位置把SO文件复制到对应的libs目录下。最重要的步骤就是后面调用debug.bat的脚本地方,后面再说。

其中clean.bat脚本:

set dir=%~dp0
set ndk=d:\Android\ndk\ndk-build.cmd
cd /d %dir%
if exist %ndk% ( %ndk% clean)else ( ndk-build clean)

这个是清理用的。

其中debug.bat脚本需要一个参数,就是你当前测试APK的包名,注意我上面调用的方式是:==call ./debug.bat com.bigsing.hooktest==,需要你测试的APP已经在手机中安装过,脚本会删除已经存在的SO文件,然后导入新编译好的SO。

set dir=%~dp0
set package=%1%
set modulename=test
set modulefile=..\libs\armeabi\lib%modulename%.so
set destso=/data/data/%package%/lib/lib%modulename%.so
cd /d %dir%
echo off
if exist %modulefile% (
 echo 1.delete old file: %destso%
 adb shell "su -c ' rm %destso%'"
 echo 2.push so to /data/local/tmp
 adb push %dir%%modulefile% /data/local/tmp/lib%modulename%.so
 echo 3.copy so to /data/data/%package%/lib
 adb shell "su -c ' cp /data/local/tmp/lib%modulename%.so /data/data/%package%/lib'"
 echo 4.chmod 755 so
 adb shell "su -c ' chmod 755 /data/data/%package%/lib/lib%modulename%.so'"
 echo success
 echo u can rm other data here...
 adb shell "su -c ' rm -r /data/data/%package%/databases'"
 adb shell "su -c ' rm -r /data/data/%package%/shared_prefs'"
 adb shell "su -c ' rm -r /data/data/%package%/cache'"

)else (
 echo error! file not found: %dir%%modulefile%
)
echo on

编译

在VS里直接按F7会执行编译操作,便会调用【生成命令行】build.bat,如果代码编写得没有问题,则会产生如下类似日志:

1>------ 已启动生成: 项目: HookTest, 配置: Debug Win32 ------
1>正在执行生成文件项目操作
1>[armeabi] Compile++ thumb: test <= test.cpp
1>[armeabi] SharedLibrary : libtest.so
1>[armeabi] Install : libtest.so => libs/armeabi/libtest.so
1>已复制  1 个文件。
1>1.delete old file: /data/data/com.bigsing.hooktest/lib/libtest.so
1>2.push so to /data/local/tmp
1>[ 78%] /data/local/tmp/libtest.so
1>[100%] /data/local/tmp/libtest.so
1>f:\svnlocal\hooktest\app\src\jni\..\libs\armeabi\libtest.so: 1 file pushed. 3.3 MB/s (83248 bytes in 0.024s)
1>3.copy so to /data/data/com.bigsing.hooktest/lib
1>4.chmod 755 so
1>success
1>生成日志保存在“file://f:\svnlocal\hooktest\app\src\jni\src\Debug\BuildLog.htm”
1>HookTest - 0 个错误,0 个警告
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

如果编译出错,会产生如下类似日志:

1>------ 已启动生成: 项目: HookTest, 配置: Debug Win32 ------
1>正在执行生成文件项目操作
1>[armeabi] Compile++ thumb: test <= test.cpp
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp: In function '_jstring* Java_com_bigsing_hooktest_NativeHandler_getString(JNIEnv*, jclass, jobject, jint, jstring)':
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp:35:1: error: expected unqualified-id before '}' token
1> }
1> ^
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp:35:1: error: expected ';' before '}' token
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp: In function '_jstring* getInfo(JNIEnv*, jclass, jobject, jint, jstring)':
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp:73:2: error: expected unqualified-id before '}' token
1> }else if((int)paramInt == 2){
1> ^
1>f:/svnlocal/hooktest/app/src//jni/src/test.cpp:73:2: error: expected ';' before '}' token
1>make.exe: *** [f:/svnlocal/hooktest/app/src//obj/local/armeabi/objs/test/src/test.o] Error 1
1>生成日志保存在“file://f:\svnlocal\hooktest\app\src\jni\src\Debug\BuildLog.htm”
1>HookTest - 4 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

其实很容易找到出错的源码文件及对应的行号。

节省了哪些时间?

1、蹩脚编辑器开发C++浪费的时间

借助VS和VAX强大的索引和自动完成代码来节省开发时间,保证代码的正确性。

2、重新编译APK的时间

整个过程不需要重新编译AndroidStudio工程。

3、重新签名的时间

整个过程不需要签名APK包。

4、安装APK的时间

只需安装一次APK包,后面调试测试的时候均无需安装APK包。

原理与总结

只要APK安装一次之后,它的SO路径就固定了,就在/data/data/包名/lib/下,因此我们可以在编译成功后,把原SO文件删除,然后把新编译的SO文件push到lib目录下,最后重新运行一下APP就会加载新的SO了。

如果担心数据缓存会对测试造成影响,则可以在脚本中编写删除缓存文件的命令(上面的脚本会删除cache、database、shared_prefs目录),如果有需要还可以编写自动杀死已经在运行的APP并自动打开的命令。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Visual Studio 2008中文版官方下载地址
  • Visual Studio中的jQuery智能提示设置方法
  • 使用VisualStudio开发php的图文设置方法
  • Visual Studio中js调试的方法图解
  • 在Visual Studio中用C++语言创建DLL动态链接库图文教程
  • VisualStudio 使用Visual Leak Detector检查内存泄漏
  • Visual Studio 2015和 .NET Core安装教程
  • Visual Studio 2015安装步骤详解
  • Visual Studio 2017安装失败的解决方法
(0)

相关推荐

  • 使用VisualStudio开发php的图文设置方法

    现在,三层.mvc之类的思想遍地开花,使得代码和html得以分离,加之随着开发的分工和项目的增大,一个好的IDE能为编码工作提供了许多的便利.就像开发java用eclipse,.NET用visual studio一样,开发PHP也很需要一种这样的利器.常见的php的IDE有Eclipse,NetBeans,Zend studio,vs.php等.这几个我也都用过,其中Eclipse,NetBeans,Zend studio都有win和linux的版本,也都集成了像代码感知.调试.设计.片段等的功

  • Visual Studio 2015和 .NET Core安装教程

    安装 Visual Studio 和 .NET Core 1.安装 Visual Studio Community 2015,选择 Community 下载并执行默认安装,Visual Studio 2015 安装程序首页 2.安装.NET Core + Visual Studio 工具,windows系统的可以从这里下载 创建 Web 应用程序 1.起始页 点击 新建项目(或 文件→新建→项目) 2.选择 左侧 .NET Core (如果没有安装.NET Core + Visual Studi

  • Visual Studio 2015安装步骤详解

    亲身经历记录下来,以备后用.也希望能够帮助到有需要的朋友们! 1.安装之前首先下载VS2015,下载地址: [VS2015社区版官方中文版下载]:http://download.microsoft.com/download/B/4/8/B4870509-05CB-447C-878F-2F80E4CB464C/vs2015.com_chs.iso [VS2015专业版官方中文版下载]:http://download.microsoft.com/download/B/8/9/B898E46E-CBA

  • 在Visual Studio中用C++语言创建DLL动态链接库图文教程

    什么是DLL(动态链接库)? DLL是一个包含可由多个程序同时使用的代码和数据的库.例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数.因此,每个程序都可以使用该DLL中包含的功能来实现"打开"对话框.这有助于促进代码重用和内存的有效使用.这篇文章的目的就是让你一次性就能了解和掌握DLL. 为什么要使用DLL(动态链接库)? 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可以将它构造成相对独立的功能模块并在之后的项目中重复

  • Visual Studio中的jQuery智能提示设置方法

    1.VS2008 1) 安装VS2008 SP1补丁,下载链接.SP1补丁提供Javascript脚本库的智能提示功能. 2) 安装KB958502补丁,下载链接.KB958502补丁支持-vsdoc.js智能提示文件的关联功能,更多说明. 3) 下载jQuery原文件及-vsdoc.js文件,并通过相同的文件名前缀进行关联. 例,下载jquery-1.2.6.js和jquery-1.2.6-vsdoc.js, 拷贝到本地目录并引入到Web应用程序或Web站点的工程中. 现在你只需要添加jque

  • Visual Studio 2017安装失败的解决方法

    vs2017安装操作失败,今天VS2017更新之后...MVC5右击没有Controller出现 然后我就修复,重装...都不行并且出现 安装操作失败..提示.Net.Core.SDK安装失败 然后我又下载了个SDK...装不上去... 错误提示: 由于发生一个或多个包故障,产品未能安装列出的工作负荷和组件. 工作负荷不完整 ASP.NET 和 Web 开发 (Microsoft.VisualStudio.Workload.NetWeb,version=15.0.26323.1) 组件不完整 .

  • VisualStudio 使用Visual Leak Detector检查内存泄漏

    那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简称vld). vld工具是VC++环境下一款小巧易用.免费开源的内存泄漏检测工具,vld可以显示导致内存泄漏的完整内存分配调用堆栈.vld的检测报告能够对每个内存泄漏点提供完整的堆栈跟踪,并且包含其源文件及行号信息. 安装过程是,先在到地址http://vld.codeplex.com/下载vld安

  • Visual Studio中js调试的方法图解

    第一步:在需要打断点处写上 debugger; 第二部:在IE中将禁用脚本调试的钩去掉 打开IE -> 工具 -> 选项 -> 高级 -> 去掉禁用脚本调试(Internet Explorer)和禁用脚本调试(其他) 不用调试时记得将IE去掉的钩,钩上,以免打开其它网页报错!

  • 详解如何使用VisualStudio高效开发调试AndroidNDK

    本文介绍了如何使用VisualStudio高效开发调试AndroidNDK,分享给大家,具体如下: 场景 场景一:Java层代码与SO的开发分为不同的程序猿负责,开发SO的时候基本上APK的其他文件不会修改. 场景二:主要代码就是C++,Java层代码也只是个DEMO,Java代码基本没啥修改. 常见的做法是: 1. 使用编辑器或者编译器编写C++代码. 2. 使用NDK命令编译SO. 3. 重新打包APK,或者直接替换APK中的SO文件再重签名. 4. 安装到手机. 5. 运行. 6. 崩溃.

  • 详解Android Studio正式签名进行调试的实现步骤

    详解Android Studio正式签名进行调试的实现步骤 在Android Studio中,可以使用Gradle进行打包时自动签名.其实Android Studio默认会给调试应用加上Debug签名,但有时候调一些第三方SDK时,需要正式签名才能调起来,所以接下来分享一下使用Gradle自动签名的方法. 一.创建签名文件 打开AS,选择Build->Generate Signed APK,选择要打包的项目,点击Next,再点击Create new...创建签名文件 填写签名文件响应信息,如下所

  • 详解dll动态库的开发与调用及文件的读写小程序

    详解dll动态库的开发与调用及文件的读写小程序 首先我们先来学习一下动态库的调用,先找到动态库的.dll和.lib文件并将其导入到同源文件相同级别的文件夹下面,然后在添加进其头文件,并右击项目处,然后点击链接,链接我们的lib文件(一定要是全名称包括扩展名),然后我们就可以调用动态库的函数了. Dll是我们具体的函数, lib使我们的函数描述文件. #include <stdio.h> #include <stdlib.h> /* 该代码是对文件读写操作的使用 */ #pragma

  • 详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)

    最近疫情比较严重,很多公司依靠阿里旗下的办公软件钉钉来进行远程办公,当然了,钉钉这个产品真的是让人一言难尽,要多难用有多难用,真的让人觉得阿里的pm都是脑残才会设计出这种脑残产品,不过吐槽归吐槽,该用还得用,虽然钉钉别的功能很鸡肋,但是机器人这个功能还是让人眼前一亮,属于比较极客的功能,它可以将第三方服务的信息聚合到钉钉群中,实现信息的自动化同步,例如:通过聚合Github.Gitlab等源码管理服务,实现源码更新同步:通过聚合Trello.JIRA等项目协调服务,实现项目信息同步:同事,支持W

  • 详解spring如何使用注解开发

    在Spring4之后,要使用注解开发,必须要保证aop的包导入了. 使用注解需要导入context约束,增加注解的支持. <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance

  • Java Spring详解如何配置数据源注解开发以及整合Junit

    目录 Spring数据源的配置 数据源(连接池)的作用 数据源的开发步骤 手动创建数据源 Spring注解开发 Spring原始注解 Spring新注解 Spring整合Junit Spring集成Junit步骤 Spring数据源的配置 数据源(连接池)的作用 数据源(连接池)是提高程序性能如出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 常见的数据源(连接池):DBCP.C3PO.BoneCP.Druid等 数据源的开发步骤 1.

  • 详解android studio游戏摇杆开发教程,仿王者荣耀摇杆

    最近在做一个山寨版的王者荣耀,刚开始做的时候毫无头绪 摇杆的多点触控做的特别烂 经过几天的思考已完美解决所有问题,下面就和大家分享下这个摇杆的开发思路 若有不正之处,请多多谅解并欢迎指正. 首先这个摇杆要用到较多的数学知识,小编的数学特别烂也就高中水平吧 我们这个摇杆一共就五个按钮,一个移动摇杆.三个技能摇杆和一个普通攻击按钮 最终效果 好了废话少说让我们开始吧 新建一个项目 建好项目之后,我们先新建一个类叫做"画".也是我们的主View 修改Hua.java的代码 public cl

  • 详解vue.js组件化开发实践

    前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然成为了第一个问题.鉴于目前web前端mvvm框架以及组件化开发方式的流行,决定技术栈采用:vue + es6 + 组件化. 这里首先简单说下web前端组件化开发方式的历程: 最早的组件化结构,代码结构可能如下: - lib/components/calendar |- calendar.css |-

  • 详解VS2017 Linux 上.NET Core调试

    Visual Studio 2017 通过SSH 调试Linux 上.NET Core 应用程序. 本文环境 开发环境:Win10 x64 Visual Studio 2017 部署环境:Ubuntu 14.04 x64 .NET Core SDK 1.0.1 Ubuntu上安装.NET Core SDK Ubuntu 14.04 x64 sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotn

  • 详解使用webpack+electron+reactJs开发windows桌面应用

    electron是一两年前挺火的一个框架 本质上是一个浏览器,但是集成了很多windows系统的功能,让前端开发也可以直接操作windows的窗体,做成一个实打实的桌面软件 (当然听说mac上也可以用electron,不过没试过) (没错我还在用windows,不是mac也不是linux,我是个lowB) 团队主要的技术栈是react,所以考虑用react开发,方便维护. PS.由于项目是大半年前做的,所以一些细节可能记忆有误请见谅 几个重点: 1.想要能调试必须使用webpack打包,不能用r

随机推荐