Android NDK开发之入门示例 用C++ 写一个能四则运算的计算器

简介: 这回用Android的NDK技术写一个计算器练练手,啥是Android的NDK开发?看看Google的介绍--传送门为啥要用NDK开发呢,NDK是用C++ 写的,运行效率特别高,在一些需要复杂计算的地方(例如游戏开发),还有就是Java代码反编译比较简单,很容易被反编译暴露源码,C++的反编译难度较大,涉及到加密的代码可以用C++来写。

这回用Android的NDK技术写一个计算器练练手,啥是Android的NDK开发?看看Google的介绍--传送门

为啥要用NDK开发呢,NDK是用C++ 写的,运行效率特别高,在一些需要复杂计算的地方(例如游戏开发),还有就是Java代码反编译比较简单,很容易被反编译暴露源码,C++的反编译难度较大,涉及到加密的代码可以用C++来写。当然用NDK开发也有缺点,C++代码上手比Java难,而且用C++后调试难度增加,所以是否要引入C++要权衡之后再决定。
我在暑假用C++写了一个能四则运算的小程序,现在想在Android端也写一个支持四则运算的计算器,要是再用Java重写一遍就太麻烦了,正好可以用这个练一练Android的NDK开发。
工欲善其事必先利其器,还么有配置好NDK开发环境的可以看我上一篇文章--传送门;
环境配好了,话不多说,开始撸代码吧。新建一个项目,

img_e2ba4fd07e03f05c57baaa9590e7ae73.png
新建项目.png

一定要把 Include C++ support 选中,然后 next,然后到选中Android版本,选择Activity的地方,都默认即可,一路 next
img_32424177bfc722f4b908a49c40a9be6f.png

到这还是默认就行,然后 finish,等项目创建成功后会看到熟悉的界面
img_39e4fc7e903298983791976f756c8fd4.png

和我们普通项目有点区别的地方是在 ActivityonCreate方法中会多出一段代码和一个方法

static {
        System.loadLibrary("native-lib");
    }
public native String stringFromJNI();

这段代码是用来加载C++生成的动态库,方法是一个本地方法,我理解为调用C++函数的方法。
先介绍到这,然后开始计算器界面的编写,这和普通的界面编写没有区别,就不多说了,上一个效果图吧

img_db617cd0831bcb0e6c8aed1163dfbea9.png
效果图

接下来就是Activity中的各种逻辑的编写,点击事件的处理,代码有点多,先不贴了,最后我会分享。
注意了,到这重点来了,要新建C++代码的源文件和头文件。在CPP文件夹上右键 New-> C++class,填写文件名-> OK
你会发现在CPP目录下没有刚才新建的文件,我靠,AS出BUG了吧。不要急,在导航栏的最下边找到CMakeLists.text,点开,在图上标注的地方添加代码
img_39bc9ede2d294f396762ccc5add9ddb7.png
CMakeLists.txt

src/main/cpp/native-lib.cpp 下面添加 src/main/cpp/×××××.cpp
××××是你的C++源文件的名。点击右上角的 Sync Now,等待同步完成。
这时你会发现CPP目录下有多了两个文件
img_2459806d8bd8b1ffb5efb00b85eb18a2.png
CPP

这时回到 MainActivity 中,把 public native String stringFromJNI();方法修改一下。改成这样 public native double stringFromC(String s);。为啥要改成这样呢,因为我们要做一个计算器,所有的按键逻辑和显示工作由Java代码完成,而计算工作由C++ 代码去做,Java层要传递一个字符串给C++层,然后C++层把计算结果返回给Java层,Java层来显示计算结果。所以要加一个 String类型的形参,把返回值改成double。这时会报错,然后按 Alt+回车 键AS会自动修改。现在来到 native-lib.cpp文件,把刚开始AS生产的函数删掉,只保留这一个函数

JNIEXPORT jdouble JNICALL
Java_com_bruce_counter_MainActivity_stringFromC(JNIEnv *env, jobject instance, jstring s_) {
    const char *s = env->GetStringUTFChars(s_, 0);

    // TODO

 //   env->ReleaseStringUTFChars(s_, s);
}

NIEXPORT jdouble JNICALL 是在 jni.h中定义的返回值类型,不清楚jni类型的可以看一下
如果有env->ReleaseStringUTFChars(s_, s);代码,把他删掉,用不到。
完成的native-lib.cpp代码

#include <jni.h>
#include <string>
#include "Counter.h"
using std::string;
extern "C"
JNIEXPORT jdouble JNICALL
Java_com_bruce_counter_MainActivity_stringFromC(JNIEnv *env, jobject instance, jstring s_) {
    const char *s = env->GetStringUTFChars(s_, 0);

    // TODO
//    env->ReleaseStringUTFChars(s_, s);
    string str=s;
    delete s;
    Counter *c=new Counter();
    double d=c->coutn(str);
    delete c;
    return d;
}

指针 ‘s’ 指向的就是我们从Java层传过来的字符串,我们把他保存下来,然后delete s,听说不delete会内存泄露,还没求证,就先这样写吧。Counter类是负责计算的,调用Counter的countn函数,就能得到结果。
为啥要在native-lib.cpp中调用这些方法呢?我的理解native-lib相当于main函数,Java调用C++会先调用这个。好了,整个C++层代码基本完成了。
到Java中去调用吧。

displayStr=displayStr.replace("×","*").replace("÷","/");
screen.setText(stringFromC(displayStr)+"");//计算结束更新屏幕

先说一个遇到的坑,在Java中乘号用的'×',除号用的'÷',Java用的unicode编码,没有问题,但是C++默认用的是ASCII编码,不能使用’ב’÷‘,我们使用‘*’和‘/’代替,所以在传入字符串时要替换一下displayStr=displayStr.replace("×","*").replace("÷","/");
到这基本就好了,可以运行一下看看了。
发现写博客比写代码累多了,就先写到这吧,我已经把完整的demo上传到码云,需要的同学可以去下载。如果还有什么问题就贴在在评论区吧,一起学习。

目录
相关文章
|
4天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
23 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
13天前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
37 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
16天前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
118 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
29天前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
79 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
5月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
211 1
|
7月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
182 4
|
8月前
|
XML Java Android开发
Android Studio2.2 中支持NDK开发HelloJNI例子
Android Studio2.2 中支持NDK开发HelloJNI例子
40 0
|
算法 Java 编译器
Android NDK开发初试(基础)
首先,什么是NDK开发,听到这个词,我的第一感觉是高大上的,其实倒也没错,NDK在Android开发中属于偏底层的,需要与C++等进行联系,它没有像应用层开发那么灵活,但是作为开发者,我们必须了解其简单的使用,及为什么要使用它?
326 0
|
Android开发
Android开发教程之NDK开发趟坑之旅
Android开发教程之NDK开发趟坑之旅
Android开发教程之NDK开发趟坑之旅
|
Java Android开发 C++
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)
219 0
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)

热门文章

最新文章

  • 1
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    24
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    32
  • 3
    Android历史版本与APK文件结构
    120
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    27
  • 5
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    23
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    56
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 8
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    73
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    118
  • 10
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
    29