问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何更新android studio中的ndk

发布网友 发布时间:2022-04-22 21:48

我来回答

2个回答

热心网友 时间:2023-06-24 14:57

1、NDK开发就是JNI开发

2、先新建一个增量升级的工具类PatchUtil,定义一个本地方法patch。

AS菜单栏,依次选择Build->Make
Project。执行完之后,把Project栏切换成project视角,依次打开app->build->intermediates->classes->debug->com->winter->updetedemo->utils,可以看到该文件夹下有一个PatchUtil.class文件。com->winter->updetedemo->utils这一路径其实就是PatchUtil所在的包名,这个实际开发的时候请根据自己的包名找相应的路径。

三、然后我们用上面找到的.class文件,生成一个C/C++的头文件。首先打开AS的terminal界面

以下两个命令 cd app\build\intermediates\classes\debug javah -jni com.winter.updatedemo.utils.PatchUtil,如下图:

然后我们再看debug文件夹下,会 发现多出来一个com_winter_updatedemo_utils_PatchUtil.h文件,

(这就是我们需要的头文件)

文件的内容打开看:

里面声明了一个函数JNIEXPORT jint JNICALL
Java_com_winter_updatedemo_utils_PatchUtil_patch(JNIEnv *, jobject,
jstring, jstring,
jstring);这个函数就是PatchUtil类里面本地方法的C实现。当然头文件里只是一个函数声明,接下来就要实现这个函数。

四、建立jni文件夹,把生成的头文件拷贝进去。在app\src\main文件夹下右键,依次选择New->Folder->JNI
Folder,然后main文件夹下会生成一个新的文件夹jni,先把头文件拷进去。

接下来就需要用到bsdiff这个工具,bsdiff是一个开源的二进制差分工具,用来生成增量升级所需的差分包;与其相对应的bspatch则用来通过差分包合成新的APK包。对于客户端而言,只需要完成bspatch的功能就可以了,bsdiff的功能一般由服务端实现。另外,bsdiff依赖bzip2,所以分别把两个工具下载下来。bsdiff下载地址:bsdiff下载地址bzip2下载地址:bzip2下载地址bzip2解压后又很多文件,但是用到的并不多,所以在jni文件夹下新建一个文件夹,把一下文件拷贝进去:

然后把bspatch.c文件考到jni文件夹下。然后做以下修改:1.找到第31行#include ,改成#include "bzip2/bzlib.h"2.在37行下面添加一行,新行内添加之前生成的头文件
#include
"com_winter_updatedemo_utils_PatchUtil.h"3.把main()函数的名称修改掉,改成applypatch()或其他名称4.在bspatch.c文件末尾添加以下函数:

函数的名称和参数与com_winter_updatedemo_utils_PatchUtil.h一致,其实就是PatchUtil里patch()方法的C实现。
以上步骤完成后,再在jni文件夹下新建一个Android.mk文件,文件中的内容为:

OK,jni文件夹下的工作做完了。

六、最后修改下app文件夹下的build.gradle文件,在defaultConfig代码块中添加以下内容

这里有一点需要注意,moleName是最后编译生成库的名称,当然,最终的.so文件会加一个前缀“lib”,例如上面的代码,编译后生成的.so文件的全名会是libpatch.so。另外,回头看一下PatchUtil类中的static代码块,调用了加载库文件的系统方法,其中的库文件的名称,与moleName是一致的,不要加任何前后缀。

七、所有的工作都结束了,patch方法已经可以被调用了,在Activity里起一个线程,调用PatchUtil.patch(),就可以进行APK包的合成了。

八、bsdiff下载地址中,除了可以下载bsdiff的源码,还可以下载windows环境下的.exe可执行文件,下载下来,就可以在本地手动生成差分包,而不需要依赖服务器了

热心网友 时间:2023-06-24 14:58

1.3以后就支持NDK了建议你升级吧,目前是1.3.1版本了你自己看吧,设置这里多了个NDK的配置new File 的时候,也有c/c++选项了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
挖掘机上的字母标志是什么牌子的挖机 中国市场上挖掘机那国技术占优 微信个人标签经典短句最精辟的微信个性签名 肚子总是不消化,吃完东西不想上厕所。涨涨的 最近老是肚子疼,但疼一会儿就不疼了,就是不想上厕所,有时候五六天都没... ...但是不疼几乎每天早上都会不舒服,也不想上厕所,就是弄的你睡不着觉... 我的肚子老疼,但不是很想上厕所,最近有点拉肚子,可是一吃凉的东西肚子... 因为节目结缘却最终分开,姚沐希彭措的分手,暗示了娱乐圈什么问题? x79支持什么显卡 四叶草是不是三叶草? 同学请客吃饭就我没去,我要怎么办 为什么android studio 打包的程序进程不识别 同学请客吃饭的时候,我如果每次大家都去了就我不去的话会怎样呢? android 怎么把多个so文件编译成jar 同学请我吃饭的时候我如果每次都不去的话会怎样呢? build gradle中ndk怎么创建多个modulename 同学请客吃饭不去应该怎么回答? android studio nd开发到底要不要自己配置.mk文件 同学请客吃饭提议应该说些什么 android jni cmake和 mk的不同 同学请客我该怎么办? 如何为Android NDK的gradle构建文件中指定NDK 同学请我去吃饭的时候我如果直接不去的话会怎样呢? 如何提高android.mk的编译速度 感谢同学请客的话 同学请我吃饭的时候我如果直接不去的话会怎样呢? 过生日时,同学之间互相请客你认为这样好吗?请说说你的理由 同学请客吃饭感谢的语言 同学请客吃饭指明只能我一个人去,心里不愉快就借故没去,你怎样看? 怎么让机制饺子皮不变酸不粘皮 如何处理同学间互相请客吃饭的问题? android studio中怎么打包.so库文件 同学请我帮陪客人吃饭我应怎么做? android bionic 在ndk中吗 帮了一两次小忙,同学老是要请客吃饭怎么办? 应不应该拒绝 android jni abifilters为什么没产生文件 android studio 怎么生成so 现在用androidstudio进行NDK开发成熟吗 迁移一个eclipse工程到AndroidStudio有哪些坑 Android studio 编译的时候gc overhead limit exceeded 如何引用android ndk自带的iconv Android Studio 为什么老是加载不起.so文件? 华为手机CPU构架32位的如何运行只支持64位的游戏? 请问为什么vivoz5x充电的时候现在变成了普通充电而不是闪充呢???_百度... 手机浏览器下载的缓存视频,怎么导出 vivo z5的充电口是什么接口? 我vivoz5手机充三小时才充满 才买了三周就 要充这么久是怎么回事?_百 ... vivoz5快充协议 怎样可以让vivoZ5手机充电变得很快? 手机里缓存的那些视频,怎样放到本地?