jni入门级别教程

2023-11-11

前提条件

笔者假想着:能看到这篇博客的读者 NDK环境 已经配置好了哈

开发步骤

第一步:新建工程

工程建完之后在真机或模拟器上运行一遍,确保工程建的没问题

第二步:配置NDK

第三步:在Java中添加 native 函数 并 调用

我们这里就借助 MainActivity 来写一个 native 函数并调用

package com.wust.jnitest3;

import androidx.appcompat.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 = findViewById(R.id.sample_text);
        tv.setText(jniTest());  //我们在这里调用一下
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
    public native String jniTest();   //这里是我们自己定义的 原生函数
}

第四步:在cpp 中创建c/c++ 源文件

第五步:C++代码的编写

//
// Created by yiqi on 2021/4/1.
//
// jni 开发必须的 头文件
#include "../../../../../../sfDownload/sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/jni.h" 

JNICALL extern "C" JNIEXPORT // 不加好像会报错
        jstring // native 方法的返回值
// c/c++ native 方法命名规则。  Java_包名_native方法所在的类名_native的方法名
// 后面那两个参数是必须要有的。  *env。 是java 和 c/c++ 互调常用的方法   thiz。  是nation 方法所在类的对象
        Java_com_wust_jnitest3_MainActivity_jniTest(JNIEnv* env,jobject thiz){
    char * str = "我来自C++";
    jstring text = (*env).NewStringUTF(str);
    return text;
}

第六步:添加编译配置

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             # 设置生成.so 的文件名,也是你在 java 代码里调用的名字,填一个就好了,记住!!!
             native-lib

             # Sets the library as a shared library.
             #设置库的类型  一种静态文件  STATIC .a   一种动态文件  SHARED .so
             SHARED

             # Provides a relative path to your source file(s).
             # 需要编译的c/c++ 文件,这里填相对路径
             native-lib.cpp
             myFirstJni.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
                       # 指定链接的目标库
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

第七步:运行

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

jni入门级别教程 的相关文章

  • 如何在RecyclerView中实现setOnScrollListener

    当用户到达列表中可见的项目时 如何在底部显示进度栏 我已经编写了一个代码 其中我使用网络服务获取数据 现在我想填充部分记录 因为我有大约630 条记录在我的 JSON 中 这是我用来从 JSON 获取数据并填充到 RecyclerView
  • Java正则表达式以数字和固定长度开头的字符串

    我制作了一个正则表达式来检查 String 的长度 所有字符都是数字并以数字开头 例如 123 以下是我的表情 REGEX 123 d 9 但它无法检查字符串的长度 它仅验证那些长度为 9 并以 123 开头的字符串 但如果我传递字符串 1
  • pthread_join() 中的阻塞

    根据手册页 pthread join 函数应暂停调用的执行 线程直到目标线程终止 除非目标线程 已经终止了 因此 据我了解 调用进程将阻塞 直到指定的线程退出 现在考虑以下代码 pthread t thrs NUMTHREADS for i
  • 多行 JTable 单元格在编辑期间不是多行的

    我正在开发一个应用程序 它有一个需要多行单元格的 JTable 因此 我扩展了 JTextArea 一切都显示出来了 但是当我尝试编辑单元格时 文本显示为单行 编辑后变为多行 我希望文本在编辑过程中保持多行 有没有办法做到这一点 创建您的表
  • CTAD 可以在模板类的成员内部使用吗?

    C 有一个有用的功能 即模板参数隐含在模板类内的代码中A 然而 对于建筑来说 这似乎与 CTAD 发生冲突 如何让 CTAD 优先 例如 这里有一个错误f会员因为A被解释为A
  • 如何使用Netbeans的不确定进度条样式?

    我正在使用 Nimbus 外观和感觉编写 Java 应用程序 不幸的是 Nimbus 外观和感觉的不确定 JProgressBars 的外观是AWFUL 见下文 另一方面 我注意到 Netbeans 与 Nimbus 的外观和感觉有不同的不
  • 无法从 Windows Phone 8.1 访问 .NET 4.5 PCL 中的本地化资源

    我在访问针对 NET 4 5 的可移植类库中的本地化字符串资源时遇到问题 我允许用户在第一页上选择语言 并在其他页面上获得本地化体验 我试图通过代码获取资源来实现这一点 MyTextBloxk Text PasswordResetMetho
  • 如何保护Linux中的堆内存?

    我想将一块堆内存设置为只读 为此我尝试过memalign with mprotect 但是从 memalignment 中我能得到什么 memalign 从进程堆中分配内存 我想将堆的某些部分设为只读 有什么帮助吗 malloc gt mm
  • 如何阻止TreeItem选择?

    我正在与一个TreeTableView JavaFX 8 有一些树节点必须禁用才能选择 我已经尝试过选择活动 但它不起作用 请查找以下代码以获取更多信息 treeTableView getSelectionModel selectedIte
  • 是否有适用于 Amazon 产品 API 的最新 C# 示例?

    我正在尝试创建一个与亚马逊的产品 API 交互的小型应用程序 获取文章的价格等 不幸的是 到目前为止我发现的与 Amazon WCF 服务交互的所有 C 示例都已过时 我知道 Amazon 决定每个服务调用都必须使用个人 accessKey
  • 如何使用 Jericho HTML 解析器获取特定标签之间的文本和其他标签?

    我有一个包含特定标签的 HTML 文件 例如 table cellspacing 0 结束标签是 table 现在我想获取这些标签之间的所有内容 我正在 Java 中使用 Jericho HTML 解析器来解析 HTML 是否可以获取 Je
  • Java 应用程序中 PKIX 路径构建失败

    将应用程序从 Windows 2000 迁移到 Windows 2008 R2 Server 后 我花了将近一周的时间才让我的应用程序正常运行 步骤 安装Java JDK 1 7 0 25 设置系统环境变量JAVA HOME to C Pr
  • 访问 ASP.NET 中 App_Code 中未声明的类

    我有时定义业务逻辑类来 帮助 我的 ASPX 代码隐藏类 对我来说 将它们都包含在代码隐藏文件中是最有意义的 因为它们一起工作 但是 我偶尔想从 App Code 中定义的更高级别的类访问业务逻辑类 但它们不能在文件外部自动访问 因此 问题
  • 使用 Regex/C# 将 转换为

    奇怪的问题 但我不会浪费时间解释为什么我需要这样做 只是我需要这样做 我有以下内容
  • 理解 htonl() 和 ntohl()

    我正在尝试使用 unix 套接字来测试向本地主机发送一些 udp 数据包 据我了解 当设置 ip 地址和端口以发送数据包时 我会填写我的sockaddr in将值转换为网络字节顺序 我在 OSX 上 我很惊讶这个 printf ntohl
  • Oracle 数据库,SQL 更新语句将不起作用 (OLEDB)

    我设置了一个数字主键和一个存储卡车 FINS 的字母数字字段 它只是数字和字母的随机组合 我不生成鳍片 这些鳍片将始终与卡车车队识别号相同 这是代码视图 storeTruckSplit truckSplit 1 Stores truck F
  • 使用 Java 删除文件时出现问题 (apache commons io)

    我通过 JNI 调用 C 方法 该方法创建两个文件 给定目录中的文本日志文件和 pdf 文件 我想在执行 JNI 方法之前删除这些文件 如果存在 我正在使用 Apache commons io FileUtils forceDelete F
  • 是否可以从C语言函数写入word文件?

    我有一个用 C 语言编写的图书馆管理系统 其中有 I O 文件 dat 如何从该函数中获取word文件的输出 void viewbooks void show the list of book persists in library int
  • Maven 依赖项插件无法解析插件的手动指定依赖项

    我遇到了一个问题maven dependency plugin Maven版本3 2 3 maven dependency plugin版本2 10 我正在尝试引入插件依赖项 我创建了一个简单的项目
  • C++ 中的编译器指令重新排序优化(以及阻碍它们的因素)

    我已将代码缩减为以下内容 这在保留我感兴趣的编译器输出的同时 尽可能简单 void foo const uint64 t used uint64 t ar 100 for int i 0 i lt 100 i ar i some globa

随机推荐

  • Win11家庭版怎么开启远程桌面

    Win11家庭是专为家庭用户准备的版本 由于Win11系统是一款全新的系统 很多用户对一些功能还不是很熟悉 那么Win11家庭版怎么开启远程桌面 下面就来看看详细教程 Win11家庭版开启远程桌面教程 1 首先 我们需要先下载安装一款远程桌
  • 黑马程序员--多线程

    黑马程序员 多线程 Java培训 Android培训 iOS培训 Net培训 期待与您交流 一 定义 进程 是一个正在执行中的程序 每一个进程执行都有一个执行顺序 该顺序是一个执行路径或叫控制单元 线程 进程中的一个独立的控制单元 线程在控
  • Ubuntu32位安装VSCODE

    Ubuntu32位安装VSCODE vscode自1 36版本后停止支持32位linux系统 所以要使用 lt 1 36版本 vscode所有版本下载地址 https code visualstudio com updates v1 33
  • ubuntu12.04搭建CUDA4.2开发环境

    实验室老师让调试一个DeepLearning的程序 叫做DropConnecte 必须要在64bit的Linux系统上运行 还要配置CUDA 本人比较笨 重装了好多次Ubuntu之后才整成功 特把整理的资料发到这里 1 动态链接库解决方案h
  • Ubuntu和vmware前期设置教程

    系统删除不要从左侧一栏删除 从菜单栏虚拟机 管理 从磁盘删除 ubuntu版本下载地址 清华镜像源 https mirrors tuna tsinghua edu cn ubuntu releases vmware tools 安装教程 h
  • YOLOv5-Lite 使用笔记

    目录 开源一些有用信息 推理部分代码提取出来 不依赖第三方库 c opencv onnx 推理
  • SQL-DAY 9(SQL应用案例:电商用户、商品、平台价值分析)

    文章目录 1 项目背景 2 使用 人货场 拆解方式建立指标体系 3 确认问题 4 准备工作 4 1 数据读取 用户行为数据 4 2 数据预处理 5 指标体系建设 5 1 用户指标体系 5 1 1 基础指标 5 1 2 RFM模型分析 5 2
  • 11月3日文章推荐

    文章目录 1 演讲 1 1 John Edward Hopcroft 开放科学 科学传播与人才培养 2 人物 2 1 John Edward Hopcroft 2 2 吴天齐 2 3 Johnson Kuan 2 4 陶中恺 3 新闻 3
  • MOS管应用---电源开关、电平转换、防反接、全桥变换器

    MOS管应用 电源开关 电平转换 防反接 全桥变换器 1 PMOS作电源开关 Q2也可以用光耦替代 电容C1 电阻R2延长MOS管导通 截止时间 实现软开启 soft start 功能 充电时间3到4个R2 C2 2 NMOS作双向电平转换
  • Java 对象序列化

    目录 一 序列化 定义 方法 代码 二 反序列化 定义 方法 代码 三 自定义类序列化 步骤 代码 一 序列化 定义 将内存中的Java对象保存到磁盘中或通过网络传输过去 方法 使用过ObjectOutputStream类实现 另外 Obj
  • Python——深拷贝与浅拷贝

    s1 你好 s2 s1 print id s1 print id s2 gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt gt
  • 嵌入式内核及驱动开发中级(上)

    目录 第一部分 一 设备分类 设备申请和注销 一 Linux内核对设备的分类 二 设备号 内核中同类设备的区分 三 申请和注销设备号 二 Code exerccise 三 知识补充 第二部分 一 函数指针复习 一 函数指针复习 1 1 内存
  • 安装tensorflow时报错的解决办法:ERROR: Could not find a version that satisfies the requirement tensorflow

    本文核心 tensorflow不可运行在32位的windows系统上 也不可运行在32位的python版本下 下面开始讲述我漫长的纠错经历 安装tensorflow时报错如下 在排除了以下问题后 网速问题 python版本与tensorfl
  • Javascript中的函数(Function)与对象(Object)的关系

    今天我们来尝试理解Function和Object 因为这个里面有些人前期可能会搞糊涂 他们之间到底是什么关系 当然也不除外当初的我 注意 官方定义 在Javascript中 每一个函数实际上都是一个函数对象 我们先来看最简单的两个代码 也是
  • ckeditor的文本文件粘贴的br问题

    前几天 忽然发现wordpress的fckeditor不再更新了 而且因为升级 导致系统的编辑器也不能用了 所以给wordpress更换了编辑器 CKEditor CKEditor for WordPress 4 0 安装完成后 感觉还好
  • Apache JMeter配置步骤压力测试实例

    一 安装环境 2 二 安装步骤 2 三 实例环境
  • java全栈工程师技术学习路线规划

    前端 HTML HTML5 CSS CSS3 Javascript jQuery RequireJS AngularJS Vue 后端 Java Struts2 Spring MVC JPA Mybatis Spring Boot 安全 S
  • [网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)

    这是作者的系列网络安全自学教程 主要是关于网安工具和实践操作的在线笔记 特分享出来与博友共勉 希望您们喜欢 一起进步 前文分享了Wireshark安装入门和一个抓取网站用户名和密码的案例 本篇文章将继续深入学习Wireshark的抓包原理知
  • Mac OSX 平台安装 MongoDB

    Mac OSX 平台安装 MongoDB MongoDB 提供了 OSX 平台上 64 位的安装包 你可以在官网下载安装包 下载地址 https www mongodb com download center community 从 Mon
  • jni入门级别教程

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