安卓之JNI 和 NDK编程(四)java调用c++代码简单介绍

Android Studio NDK开发案例一 JNI开发入门         最近在做Android的项目,用到了JNI,现将NDK的开发流程和方法整理出来,希望能够让刚接触的小伙伴们少走一些弯路。 NDK         Native Development Kit(NDK)是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java一起打包成apk。 JNI         Java Native In... 阅读详情

文章目录

1、前言

1.1 Android SDK介绍

1.2 使用纯java开发App的特点

1.3 引入NDK

2、环境搭建(简单说明,不做深入介绍)

2.1搭建Android开发环境

  2.1.1安装JDK

  2.1.2 安装Android Studio和SDK

2.2 Android NDK环境搭建

3、java调用c++代码

3.1 ndk项目搭建

3.2 java调用c++代码简单介绍

***java与c++方法映射关系1

***java与c++方法映射关系2


1、前言

1.1 Android SDK介绍

Android是基于Linux内核的一个手机操作系统,谷歌提供了开发包(Android SDK),程序员可以通过开发包开发Android APP(应用程序)。Android SDK提供java语言接口,因此Android应用是使用java开发的

1.2 使用纯java开发App的特点

在某些场合下,使用纯Java开发Android应用程序并不完美,比如:

1>、有高性能算法,Java语言无法满足

2>、有跨平台需求,希望将app移植到ios

3>、已有代码的重用

1.3 引入NDK

早在Android 1.6(2009年)时,google就提供了NDk(native development kit),NDK包括了一套Android的交叉编译环境和开发库,利用它可以编写C/C++程序,并编译成Android环境下使用的动态库,Java代码通过Jni规范,调用C/C++写的动态库。

目前从Android Studio 2.2中及以上版本,集成了C/C++开发环境,开发人员在使用C/C++更加简单了。

 

2、环境搭建(简单说明,不做深入介绍)

2.1搭建Android开发环境

  2.1.1安装JDK

  2.1.2 安装Android Studio和SDK

2.2 Android NDK环境搭建

1>下载NDK开发包

2>解压缩Android NDK

3>将NDK解压到随意目录(但是目录不能包含中文和空格)。

4>配置NDK路径

5>查看是否配置Android NDK,如下说明已经配置好

3、java调用c++代码

3.1 ndk项目搭建

默认工具链、C++11、C++14,我这里选的C++11,

生成的项目工程,cpp文件里面是C++代码,java文件里面是java代码

3.2 java调用c++代码简单介绍

MainActivity 类

package com.luminal.ndktest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
    
}

***java与c++方法映射关系1

stringFromJNI方法没有实现。它不像普通的 java方法,如onCreate方法 有大括号、方法体。

stringFromJNI没有方法体,那么它的方法体在哪里呢?在c++代码,native-lib.cpp里面,

其中关键字native代表stringFromJNI方法的代码不是用 java写的,而是用本地语言写的,

这里的本地语言就是指的 c 或 c++

当java调用stringFromJNI方法的时候,我们知道java代码在java虚拟机上运行,当java

虚拟机运行到stringFromJNI方法的时候,其实它就会去寻找

Java_com_luminal_ndktest_MainActivity_stringFromJNI方法,

这个方法在在c++代码,native-lib.cpp里面

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_luminal_ndktest_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

***java与c++方法映射关系2

Java_com_luminal_ndktest_MainActivity_stringFromJNI方法名是怎么来的呢?

Java表示是java要调用的方法

com_luminal_ndktest    Android的包名com.luminal.ndktest

MainActivity     Android的类名

stringFromJNI    Android的方法名

也就是jni规范规定了的格式,当java在调用native方法的时候,它就按照上面这种格式来找

Java_com_luminal_ndktest_MainActivity_stringFromJNI方法,

所以我们运行项目如下图,出现文字是 Hello from C++

而不是布局文件activity_main里面的 Hello World!

 

 

 

 

 

Android JNI系列详解之NDK和JNI介绍 而在Android中,Java或者kotlin代码编写程序,也是需要先生成classes文件,在Android还需要将classes文件使用dx工具打包成dex文件(会将classes中冗余的信息去除,会比class文件少很多,文件少就会减少io的操作,提高了类的查找速度),然后dex文件经过Android的虚拟机Dalvik/ART(与JVM虚拟机不同的是,android虚拟机基于的是CPU寄存器,而JVM基于的是堆栈,CPU寄存器的性能要比堆栈的高)翻译成机器码,才能给到设备执行。 阅读详情

相关推荐

Android调用C++OpenCV程序的方法(NDK+JNI)

参考:   [1] http://blog.youkuaiyun.com/donglynn/article/details/23046925         [2]http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html                [3]http://www.tuicool.com/articles/yaeeuu

superyuanzhe的专栏 4535

android5.1.1 jni代码,Android 向现有的项目添加JNI,调用C/C++代码(CMAKE方式)

1、先新建一个JNI目录,并新建一个cpp文件命名jniclass.cppimage.png2、在jni目录新建文件,命名为CMakeLists.txt# Sets the minimum version of CMake required to build your native library.# This ensures that a certain set of CMake feature...

weixin_29531897的博客 360

直流有刷电机控制 - 驱动电路(二)

1.如图所示为最常见的推挽驱动电路,我附加了具有正反转功能的电机驱动控制,正反转是由两个继电器组成。使用推挽电路来驱动NMOS管时充电电流和放电电流都很大,因此NMOS管导通快,关断也快,而且NMOS温度不会很高。下面来介绍一下该电路的原理。(1)PWM_MCU是由单片机给出的PWM波信号,该信号是由一些列高低电平的方波构成。当信号为高电平的时候Q3导通,经过R47再到Q5的g极,此时mos导通,如果是K1闭合是正转那么K2闭合就是反转。(2)当PWM低电平时使得Q3关断,Q6导通。

u011030644的博客 4720

Android App中通过JNI调用C/C++代码

1. Eclipse ADT创建android工程 2.编译java本地调用方法 package com.skymr.learn; public class HelloJni { public static native void sayHello(); public native void sayHi(); public static native String g

naruto_Mr的专栏 587

从零到精通:ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程

本文详细介绍了ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程,从环境准备到高级功能扩展,帮助开发者实现精准控制。通过集成模型预测控制(MPC),机械臂能够优化复杂轨迹规划,处理动态避障,提升工业自动化效率。

juice的博客 708

如何实现三种不同RAM?(单端口RAM、伪双端口RAM、真双端口RAM|verilog代码|Testbench|仿真结果)

RAM(随机存取存储器)是计算机系统中的一种主要存储器件,用于存储和读取数据。在RAM中,单端口RAM(Single-port RAM)和双端口RAM(Dual-port RAM)是两种常见的类型,双端口RAM又分为真双端口(True dual-port RAM)和伪双端口RAM(Simple dual-port RAM)。那么什么是单端口和双端口?又该如何区分真双端口和伪双端口?输入只有一组数据线和一组地址线,读写共用地址线,输出只有一个端口。

Loudrs的博客 1万+

android 之 java 调用 c++

java 通过 jni 即 java native interface 来调用实现 java 与 其他语言的相互调用 java调用c++ 代码的方式是通过链接库来调用的,所以需要先编译为链接库,因此可以通过camke先编译为链接库,然后调用 链接库中对应的方法, 某一个java javCls 类中需要调用 一个没有返回值的 c++ 中的 方法: 比如 nativeC++Fun javCls { ... native void nativeC++Fun(); } 实现步骤: 1 那么首先...

paxis0813的博客 1038

Flutter版本升级踩坑实录:从3.27到3.35,我们是如何修复Impeller引擎导致的花屏问题的?

本文详细记录了团队在Flutter版本升级过程中遇到的Impeller引擎导致的花屏问题及解决方案。从问题诊断到最终升级至稳定版3.35,文章分享了排查步骤、升级策略和性能对比数据,为开发者提供了实用的参考经验。

weixin_26854555的博客 506

Android Studio3.5 JAVA调用C++源码方法总结

本文主要讲述如何在Android Studio中通过JAVA调用C++编写的源码

爱问西瓜爱大树的博客 2274

MCP协议桥接AdsPower:AI原生时代的浏览器自动化新范式

浏览器自动化是Web开发和数据采集领域的核心技术,其核心原理是通过程序控制浏览器内核执行页面导航、元素交互和数据提取等操作。传统方案如Selenium和Playwright虽功能强大,但在管理多实例、指纹隔离等复杂场景下,配置和维护成本较高。随着AI原生应用的发展,Model Context Protocol(MCP)作为一种标准化协议,为AI助手与外部工具间的通信提供了统一接口,显著提升了自动化流程的构建效率和自然语言交互能力。通过MCP Server桥接AdsPower指纹浏览器的本地API,开发者可将

weixin_30552811的博客 296

Android开发java调用C简单示例

本文使用的Android Studio版本是windows版。

知道这个有什么用? 1571

免费搞定DWG转DXF:ODA File Converter保姆级配置指南(附常见报错解决)

本文详细介绍了如何使用ODA File Converter免费工具实现DWG到DXF的格式转换,包括环境配置、命令行参数解析、编程集成方案及常见问题解决。特别针对网络访问异常、参数配置等实际痛点提供应对策略,帮助用户高效完成工程设计文件的格式转换。

weixin_29291185的博客 6043

c++封装so库,供安卓android调用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

刚入视频监控行业的菜鸡2090741348 8783

【机器学习-09】特征工程

特征工程是机器学习模型构建的初步工作,但它的重要性却贯穿整个模型生命周期。在进行特征工程时,我们需要充分利用数据科学的知识和技巧,结合具体的应用场景和业务需求,来制定出最合适的特征提取和转换策略。只有这样,我们才能为机器学习模型提供最有价值的输入,从而使其发挥出最大的潜力。总之,特征工程是机器学习中的一项关键任务,它需要我们用心去探索、去实践、去创新。只有不断地优化和完善特征工程的过程,我们才能构建出更加准确、更加可靠的机器学习模型,为实际应用带来更大的价值。

qq_38614074的博客 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android Jni的介绍和简单Demo实现

JNI 全程:JNI(Java Native Interface),通俗翻译:Java本地方法官方说法:提供一种Java字节码调用C/C++的解决方案,JNI描述的是一种技术。所以这里的Nativie的本地的意思就是C/C++,所以JNI通俗理解就是Java调用C/C++的方案技术。//定义变量和方法private:int number;public://定义方法。

wenzhi的博客 3227

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android:JNI 与 NDK

在Android开发中,使用NDK开发的需求正逐渐增大但很多人却搞不懂JNI与NDK到底是怎么回事今天,我将先介绍JNI与NDK& 之间的区别,手把手进行NDK的使用教学,希望你们会喜欢,即Java本地接口作用: 使得Java与 本地其他类型语言(如C、C++)交互即在Java代码 里调用C、C++等语言的代码 或C、C++代码调用Java代码特别注意:JNI是Java调用Native语言的一种特性JNI是属于Java的,与Android无直接关系,是Android的一个工具开发包。

u013250861的博客 1509

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[安卓开发笔记二]android Studio通过jni调用C++代码

[安卓开发笔记二]android Studio通过jni调用C++代码 自己需要用到android studio开发安卓项目,为了效率需要用jni来调用C++底层代码,网上关于这方面的资源十分匮乏,自己踩了很多坑,总算明白android studio是如何进行jni的调用,记录与此,贡献自己的一点力量,让后来人少踩坑 1、开发ide:操作系统win7或者mac均可,这点没有关系哈 androi

u012341163的博客 1万+

Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码

Android开发环境配置,Android配置使用NDK(native development kit),通过NDK编译本地 C++ 代码, 使用opencv进行Android开发。 边缘检测 范例代码

Work Hard, Play Harder! 2万+

Android NDK与JNI的区别有何不同?

NDK是Android的一个工具开发包,帮助开发者快速开发C、 C++的动态库。JNI是 Java语言的一种特性,它的存在是为了Java与C/C++等语言互相调用。两者之间的其他差别敬请阅读博文。

luo_boke的博客 4421

android studio中使用ndk编译.so文件,调用C/C++代码(jni编程)

android studio中使用ndk编译.so文件,调用C/C++代码(jni编程)一.前言 什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和Java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或Linux系统环境),并提供了相应的mk文件隔离CPU、平台、A

孤途浪子 4845

Android JNI(一)——NDK与JNI基础

Java调用C/C++在Java语言里面本来就有的,并非Android自创的,即JNI。JNI就是Java调用C++的规范。当然,一般的Java程序使用的JNI标准可能和android不一样,Android的JNI更简单。

hirezy 3306

Android NDK编程

NDK简介 使用命令进行NDK开发 使用Android Studio进行NDK开发 NDK安装包

DreamWendy 5936

Android jni的调用过程

1、JNI简介 JNI全称为Java Native Interface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互。并非从Android发布才引入JNI的概念的。 2、JNI与NDK         简单来说,Android的NDK提供了一些交叉编译工具链和Androi

成长的味道 5493

Android SDK、NDK、JNI的简单介绍

Android SDK: SDK (software development kit)软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。因此!Android SDk 指的既是Android专属的软件开发工具包

hello world 8331

Android JNI/NDK 从入门到进阶

好久没发文章了,这篇文章是是10月底开始计划的,转眼到现在12月都快过一半了,我太难了……,不过好在终于完成了,今晚必须去吃宵夜。深圳北,往北两公里的**烧烤,有木有人过来?我请客,没有到时候我再来问一遍。 先看目录,各位觉得内容对你有用再继续往下看,毕竟显示有一万多个字呢,怕没用的话耽误大家宝贵的时间。 闲聊一下为什么写这篇文章? 之前写过一篇关于C代码生成和调试so库的文章。前段时间在继承...

aserbao的博客 1085
上一篇: JavaEE后台环境搭建:4、Mac系统安装配置nginx
下一篇: Cannot resolve external dependency com.android.tools.build:gradle:3.2.1 because no repositories are
被开发耽误的大厨
被开发耽误的大厨 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄15年 4万+粉丝 635原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值