Android嵌入式开发之NDK初级入门 粘贴可用阅读可懂

2023-11-02

前言:

NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西;另外就是为了效率更加高些。如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配置Cygwin ,然后需要编译生成,相当的蛋疼。要么是直接用Eclipse开发,但是前期配置也是一堆;真心蛋疼。

在AS开发NDK JNI也需要配置,不过相当Easy。第一步就是去官方下载个NDK包就可以了,像我的直接放在D盘就行了。关于怎么下载安装看这里 AD NDK会有介绍。

第二步就是就是直接写代码了,请往下看,简单的实现了一个C编写的加法通过自己编译的.so文件进行调用!

整体架构如下:



1、创建NdkJniUtils类

public class NdkJniUtils {
    public native int add(int a,int b);
}

2、在MainActivity中调用NdkJniUtils

NdkJniUtils ndkJniUtils = new NdkJniUtils();
int add = ndkJniUtils.add(2, 5);
tv.setText(add+"===");

3、打开黑窗口

如果点击之后,在Terminal中报错 找不到 包名.类文件,你就打开黑窗口 cmd 路径切换到你工程的NdkJniUtils的目录下。切换到此路径下之后 输入 javac NdkJniUtils.java之后 编译成class文件(有人会问,为什么不直接锤一下生成?答:也许是我电脑太次,不好使,我才用最稳定的黑窗口来生成...比较笨,大神勿喷)


用到的cmd命令: cd 空格 文件夹路径,即可进入到指定文件夹路径

cd.. 后退一层的命令

注意:编译完class文件之后,再回到NdkJniUtils类中加入如下代码(如果在生成class文件之前将本段放入类中则会出现转码错误):

static {
        System.loadLibrary("MySo");// 这个名是调用的.so文件名 必须要和Android.mk里的LOCAL_MODULE相同(如不懂请往下看)

    }

4、看图操作(这俩NB的插件配置教程网上特别多,我也就不详细介绍了...)



点击之后,他会在NdkJniUtils同级下创建一个 com_jiaxin_model6_NdkJniUtils.h 的.h文件,如果用工具生成.h文件报错的话,请往下看,成功则直接看下一步:

兄弟,如果你报错信息又是提示找不到类的话,你还得打开黑窗口敲命令了。。首先打开黑窗口后,进入该项目的NdkJnUtils类的目录下,敲入:javah -jni 包名.NdkJniUtils  然后,你就能看到生成了一个包名开头的.h文件

5、在jni目录(生成完.h文件会自动创建)下创建一个.c文件,我取名为jnitest

打开粘入这块儿代码即可:

#include<stdio.h>
#include<jni.h>
#include<stdlib.h>
#include "com_jiaxin_model6_NdkJniUtils.h"
JNIEXPORT jint JNICALL Java_com_jiaxin_model6_NdkJniUtils_add
  (JNIEnv *env, jobject thisz, jint a, jint b){
       return a+b; // 做了一个简单的加法..方便演示 
  }

千万记得要引入上面的include头文件!下面这个方法有没有似曾相识的感觉?对,就是.h文件里的方法,粘贴过来即可。有心的人就可以发现,只是加了一个参数名而已!(参数类型是不可以修改的,这是一个坑点,切记!)


6、还是在jni文件夹下创建一个Android.mk文件,放入如下代码:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := MySo
LOCAL_SRC_FILES := jnitest.c
include $(BUILD_SHARED_LIBRARY)

7、黑窗口又来了..因为个人认为黑窗口方便才一直用的黑窗口..打开之后,进入工程的java目录下,敲入命令 ndk-build即可生成.so文件,如图:


坑点来了,生成完so文件之后,他会多出两个包,一个是libs,一个是obj包,复制libs里的文件夹,在main目录下创建一个文件夹,名为jniLibs,将复制的文件放入,然后删掉libs文件夹!删掉!

首次配置完成之后,他会报一个


解决办法如下:

在app的build.gradle的android下添加:

sourceSets.main {
    jniLibs.srcDir 'libs'
    jni.srcDirs = []
}

全部流程一直完成了,运行即可,最终效果如下(为了演示方便,就只做了一个方法):


这是一个入门演示,如有问题请指正,后期会改正,教程结束!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android嵌入式开发之NDK初级入门 粘贴可用阅读可懂 的相关文章

  • JNI GetFieldID和GetMethodID函数解释及方法签名

    1 GetFieldID是得到java类中的参数ID GetMethodID得到java类中方法的ID 它们只能调用类中声明为 public的参数或方法 举例说明 jclass c env gt FindClass env com came
  • NDK编译时报错: Android NDK: NDK Application 'local' targets unknown ABI(s): arm64-v8a x86_64

    网上下了一个github项目 NDK编译时报错 Android NDK NDK Application local targets unknown ABI s arm64 v8a x86 64 Android NDK Please fix
  • C语言基础入门详解一

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 初识C语言 include 相当于java的import stdio全称 standard inpu
  • Android JNI编程 与 NDK开发(一) 简介,区别,使用场景

    JNI是什么 JNI 全称Java Native Interface 是java与其他语言 主要是c c 交互的接口 是java的一种特性一种协议 开发者可以通过JNI在java中调用c c 代码或在c c 中调用java代码 NDK是什么
  • Cygwin编译JNI的环境配置

    一 什么是NDK NDK提供了一系列的工具 帮助开发者快速开发C 或C 的动态库 并能自动将so和java应用一起打包成apk 这些工具对开发者的帮助是巨大的 NDK 集成了交叉编译器 并提供了相应的mk文件隔离CPU 平台 ABI 等差异
  • vlc源码编译android最新版2020年9月份记录

    经过几天研究终于在2020 9 25早上编译出安卓版本的vlc for android的so文件了 此时源码指定gradle是6 1 1版本的 主要参考都是百度上面的 你们也能百度到 这里就不引用了 重点 1 参考vlc官方编译过程 htt
  • eclipse下JNI的初步实现

    eclipse下JNI的初步实现 JNI java native interface 为java应用程序提供调用本地方法的接口 The standard Java class library may not support the plat
  • java.lang.UnsatisfiedLinkError: Native method not found 三种可能解决

    http blog csdn net lilu leo article details 10950047 so文件编译生成后 运行时 有时候会遇到Java lang UnsatisfiedLinkError Native method no
  • Cygwin环境变量设置(转载)

    开始运行bash之前 应该设置一些环境变量 cygwin提供了一个 bat文件 里面已经设置好了最重要的环境变量 通过它来启动bash是最安全的办法 这个 bat文件安装在cygwin所在的根目录下 可以随意编辑该文件 1 CYGWIN变量
  • Android 使用ffmpeg软编码 将摄像头采集视频编码成视频文件

    Android 使用ffmpeg软编码 将摄像头采集视频编码成视频文件 这次代码实现的是视频采集的功能 Android 通过jni 调用ffmpeg 编码yuv数据变成视频文件 先上代码 编码器上下文保存的实体 struct EnCodeB
  • sh ndk-build.cmd command not found

    sh中写ndk build 会报错 ndk build cmd command not found 或者报错 ndk build 未找到命令 解决方法 写ndk build的完整路径 比如 home jason android ndk r1
  • Android JNI(一):JNI基础概念

    本文讲述 NDK和JNI是什么 JNI的原理 JNI开发流程的步骤 认识JNI相关的代码语法 名称概念 什么是NDK NDK 其中NDK的全拼是 Native Develop Kit Android NDK 就是一套工具集合 允许你使用C
  • jni入门级别教程

    前提条件 笔者假想着 能看到这篇博客的读者 NDK环境 已经配置好了哈 开发步骤 第一步 新建工程 工程建完之后在真机或模拟器上运行一遍 确保工程建的没问题 第二步 配置NDK 第三步 在Java中添加 native 函数 并 调用 我们这
  • C/C++在Android开发中的应用

    JNI开发系列阅读 JNI与底层调用1 http blog csdn net axi295309066 article details 60758515 JNI与底层调用2 http blog csdn net axi295309066 a
  • Python跨平台应用-BeeWare打造移动端应用和构建Android时的异常处理

    目录 简介 安装 创建demo 运行 打包为Windows程序 打包为安卓APP 构建安卓错误处理 gt gt gradle改为本地 报错1 Could not resolve all artifacts for configuration
  • 导致java.lang.UnsatisfiedLinkError错误的一种解决办法

    欢迎转载请注明出处http blog csdn net ning gg article details 53641254 在程序中加入so文件导致java lang UnsatisfiedLinkError错误的一种解决办法 可能这个解决办
  • JNI基础

    问题1 JNI是什么 答 JNI是Java语言的机制 Java可以通过JNI调用C C 代码 C C 代码也可以通过JNI调用Java代码 问题2 NDK是什么 答 NDK是代码库 功能有两个 1 将 c cpp文件转换成 so文件 2 将
  • Android中JNI在C/C++中的区别

    一 一个疑问 在进行JNI编程中 同样一个函数FindClass C和C 中有不同的用法 如果是C 要用 env gt FindClass str 如果是C要用 env gt FindClass env str 类似的区别几乎涉及到每一个结
  • FFmpeg下载及命令行使用

    下载地址 访问FFmpeg官网 选择Dlownload 选择 Windows Package 选择相应版本 点击进行下载 并进行解压 可得到如下几个文件 版本说明 Static 只包含了3个体积很大的exe Shared 除了体积很小的ex
  • 使用Visual Studio 2019和IntelliJ IDEA 2018实现JAVA调用本地代码

    使用Visual Studio 2019和IntelliJ IDEA 2018实现JAVA调用本地代码 1 我们使用的工具是 IntelliJ IDEA 2018 编写java代码 和VisualStudio 2019 编写Native方法

随机推荐

  • 数据结构顺序表和链表(超详细)

    线性表 线性表 linear list 是 n 个具有相同特性的数据元素的有限序列 线性表是一种在实际中广泛使 用的数据结构 常见的线性表 顺序表 链表 栈 队列 字符串 线性表在逻辑上是线性结构 也就说是连续的一条直线 但是在物理结构上并
  • Java中如何编解码

    继续学习Java Web的编解码章节 记录Java中如何把ISO 8859 GB 2312 GBK UTF 16 UTF 8编码进行编码 额 System out printf x int b i 这句代码没有懂 希望大家评论帮忙解决 pu
  • html嵌入地图

    一 打开 百度地图生成器 的网址 http api map baidu com lbsapi creatmap index html 复制代码 保存html 二 在需要地图的位置 插入这行代码 长宽大小可以自定义 三 效果
  • javaweb应用的MVC分层,开发太方便了!!!

    javaweb应用的MVC分层 让我们先来了解一下 MVC开发模式的组成吧 看完这张图 你有什么看法 知道了这样的开发模式后 动手创建一个工程吧 如图是根据上图创建的一个实例 当然有很多的优点 相对于javaweb的初级开发 优点 耦合性低
  • C++简介

    C 是一种计算机高级程序设计语言 由C语言扩展升级而产生 最早于1979年由本贾尼 斯特劳斯特卢普在AT T贝尔工作室研发 C 既可以进行C语言的过程化程序设计 又可以进行以抽象数据类型为特点的基于对象的程序设计 还可以进行以继承和多态为特
  • SpringFramework核心技术一(IOC容器:IOC容器和Bean介绍)

    题记 做技术还是得一步步慢慢来 先搞懂核心原理 一味的只会用 是没有未来的啊 在现在的区块链公司当带着大家做项目的时候 我就经常说作为一名工程师 一定不能浮于表面 如果想在技术这条路上走下去 懂原理才是根本 现在框架太多 但是Spring依
  • JetBrains出品必属精品

    文章目录 JetBrains出品必属精品 数据库工具DataGrip 使用背景 工具优势 新手使用说明及常用设置说明 总结说明 JetBrains出品必属精品 数据库工具DataGrip 使用背景 笔者从业七八年 用过的数据库工具不下四五个
  • Linux 查看服务器开放的端口号

    在讨论这个问题前 我们先来了解一下物理端口 逻辑端口 端口号等计算机概念 端口相关的概念 在网络技术中 端口 Port 包括逻辑端口和物理端口两种类型 物理端口指的是物理存在的端口 如ADSL Modem 集线器 交换机 路由器上用 于连接
  • 二分查找-(在一个有序数组查找某个数字n)

    1 二分查找 注意前提 有序数组 传统方法查找的代码演示 include
  • 第二篇:mysql负载均衡、高可用方案:mysqlcluster+haproxy+keepalived

    上一篇介绍了mysqlcluster的安装和配置 本篇将描述高可用的mysql集群组建方式 高可用的mysql集群有多种方式 本篇介绍的是 mysqlcluster haproxy keepalived方案 下篇将介绍通过普通版本的mysq
  • 转载layui树形表格

    地址 https whvse gitee io treetable lay index html README md treetable lay 实现layui的树形表格treeTable 1 简介 在layui数据表格之上进行扩展实现 演
  • Kibana操作Elasticsearch-检索

    1 导入ES官方检索测试数据 本次使用kibana操作ES以这些数据为基础 ES在GitHub的地址 这段数据存在这个目录下 将这2000行json复制出来 2 使用Kibana将2000行数据导入到ES中 POST bank accoun
  • 分享一下我用Python接单的个人经历,别被死工资拖累!

    很多人都说靠python接单一个月能赚好几千 事实真是如此吗 作为一个入过python坑 靠python兼职和接单解决了自己吃喝玩乐的人就来唠一唠这个事吧 我能用Python接单也是碰巧 很早之前我是不晓得Python还能用来接单赚取外快的
  • nasm编译出问题

    用nasm编译出现如下问题 root redhat8 Source nasm algo a nasm o algo a o algo a nasm 180 error impossible combination of address si
  • 全连接层结构理解

    以上图为例 我们仔细看上图全连接层的结构 全连接层中的每一层是由许多神经元组成的 1x 4096 的平铺结构 它是怎么样把3x3x5的输出 转换成1x4096的形式 从上图我们可以看出 我们用一个3 3 5的filter去卷积激活函数的输出
  • React Hooks 组件化开发(常用)

    本文章视频地址 视频链接 一 React组件分类 二 Hook函数概览 Hook 是 React 16 8 的新增特性 并且只能运用到函数组件中 1 useState 作用 在函数组件中使用状态 修改状态值可让函数组件更新 类似于类组件中的
  • python settings.json_vscode python 之 settings.json

    python jediEnabled true python linting flake8Enabled true python formatting provider yapf python linting flake8Args max
  • ubuntu: Linux常用指令---grep(搜索过滤)

    1 基础命令 Linux系统中grep命令是一种强大的文本搜索工具 它能使用正则表达式搜索文本 并把匹 配的行打印出来 grep全称是Global Regular Expression Print 表示全局正则表达式版本 它的使用权限是所有
  • 通过adb pull和adb push 手机与电脑之间传输文件

    一 将手机卡中的某个文件复制到电脑 1 手机连接电脑后 在命令行输入 adb devices 获取到设备序列号后说明手机已经和电脑连接成功 2 输入 adb pull 手机存储路径 电脑路径 adb pull sdcard xxx User
  • Android嵌入式开发之NDK初级入门 粘贴可用阅读可懂

    前言 NDK开发 其实是为了项目需要调用底层的一些C C 的一些东西 另外就是为了效率更加高些 如果你在Eclipse ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin 配置Cygwin 然后需要编译生成 相当的蛋疼 要么