Android JNI入门到基础

news2025/1/23 14:57:56

一、JNI项目创建

AS创建项目时选择NativeC++
在这里插入图片描述
会创建一个基本的JNI项目
在这里插入图片描述
MainActivity中写java层的native方法
在这里插入图片描述
具体实现在cpp文件中
native-lib.cpp

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

extern "C"
JNIEXPORT
jstring JNICALL
Java_com_cn_techvision_jnidemo2_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
extern "C" //采用c的编译方式
JNIEXPORT  //JNI重要标记关键字,不能少
jstring    //返回值String
JNICALL     //也是个关键字(linux可以少) 约束函数入栈顺序和堆栈内存清理规则
//注意此处函数命名规则,包名类名方法名
Java_com_cn_techvision_jnidemo2_MainActivity_getStr(JNIEnv *env, jobject thiz) {
    // TODO: implement getStr()
    //如果是.c文件
    //(*env)->xxx函数
    //如果是.cpp
    //env->xxx函数
}

JNIEnv在c层和java的桥梁,不可缺少
jobject 是MainActivity的this实例(调用者)
如果getStr是一个static方法,那么这里应该是个jclass

二、通过native方法修改Java变量值

cpp:

extern "C" //采用c的编译方式
JNIEXPORT  //JNI重要标记关键字,不能少
void    //返回值void
JNICALL     //也是个关键字(linux可以少) 约束函数入栈顺序和堆栈内存清理规则
//注意此处函数命名规则,包名类名方法名
Java_com_cn_techvision_jnidemo2_MainActivity_getStr(JNIEnv *env, jobject thiz) {
    // TODO: implement getStr()
    //获取jclass对象
    jclass clazz=env->FindClass("com/cn/techvision/jnidemo2/MainActivity");
    //jfieldID GetFieldID(jclass clazz, const char* name, const char* sig)
    jfieldID  nameFid=env->GetFieldID(clazz,"name", "Ljava/lang/String;");
    jstring  value=env->NewStringUTF("helloworld");
    //void SetObjectField(jobject obj, jfieldID fieldID, jobject value)
    env->SetObjectField(thiz,nameFid,value);
}

MainActivity:

public class MainActivity extends AppCompatActivity {

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

	private ActivityMainBinding binding;
	private String name="hello";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		binding = ActivityMainBinding.inflate(getLayoutInflater());
		setContentView(binding.getRoot());

		// Example of a call to a native method
		TextView tv = binding.sampleText;
		getStr();
		tv.setText(name);
	}

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

	public native void getStr();
}

三、native函数调用java方法

cpp:

extern "C"
JNIEXPORT void JNICALL
Java_com_cn_techvision_jnidemo2_MainActivity_callAddMethod(JNIEnv *env, jobject thiz) {
    // TODO: implement callAddMethod()
    jclass clazz=env->GetObjectClass(thiz);
    jmethodID addMethod=env->GetMethodID(clazz,"add", "(II)I");
    int result=env->CallIntMethod(thiz,addMethod,1,1);
    LOGD("result:%d\n",result);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_cn_techvision_jnidemo2_MainActivity_callShowStrMethod(JNIEnv *env, jobject thiz) {
    // TODO: implement callShowStrMethod()
    jclass clazz=env->GetObjectClass(thiz);
    jmethodID showStrMethod=env->GetMethodID(clazz,"showString", "(Ljava/lang/String;)Ljava/lang/String;");
    jstring str= static_cast<jstring>(env->CallObjectMethod(thiz, showStrMethod,
                                                            env->NewStringUTF("helloworld")));
    jstring s=(jstring)env->CallObjectMethod(thiz,showStrMethod,env->NewStringUTF("helloworld"));
    //string转换为char
    const char * resultStr=env->GetStringUTFChars(s,NULL);
    LOGD("result:%s\n",resultStr);
}

java:

	private int add(int num1,int num2){
		return num1+num2;
	}
	private String showString(String str){
		return "["+str+"]";
	}
	public native void callAddMethod();
	public native void callShowStrMethod();

调用这两个native函数结果:
在这里插入图片描述

四、方法签名

上面一些方法中出现的const char* sig参数就是方法签名,用来表示字段的类型,常见字段类型示例:
Z:boolean类型
B:byte类型
C:char类型
S:short类型
I:int类型
J:long类型
F:float类型
D:double类型
[<>:数组类型,例如[I表示int数组
L<>;:引用类型,例如Ljava/lang/String;表示String类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1330183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

增强客户获取能力:探索 B 端影片行销的影响

01 B端企业短视频营销的价值与难点 短视频营销在当今的市场中越来越受到重视。有数据显示&#xff0c;越来越多的市场人将尝试增加短视频营销的预算&#xff0c;并且在2023年&#xff0c;每5个市场人中就有1个人将尝试短视频营销。相较于内容深、信息量大的长视频&#xff0c;…

CRC循环冗余校验

CRC循环冗余检验&#xff1a; 一般会给定生成多项式&#xff0c;通过生成多项式确定P&#xff08;除数&#xff09;的值&#xff08;e.g. P ( X ) X 3 X 2 1 P(X)X^3X^21 P(X)X3X21表示除数 P 1101 P1101 P1101&#xff09; 带传送的数据记为M&#xff0c;M有k位。n位冗…

高级数据结构 <二叉搜索树>

本文已收录至《数据结构(C/C语言)》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言正文二叉搜索树的概念二叉搜索树的基本功能实现二叉搜索树的基本框架插入节点删除节点查找函数中序遍历函数析构函数和销毁函数(后序遍历销毁)拷贝构造和赋值重载(前序遍历创建)其他函数…

多数据库切换?设计模式--抽象工厂引导下思路

缘起 某日&#xff0c;部门Leader找到小明&#xff1a;“小明&#xff0c;我们公司不是用的SQL Server的数据库吗&#xff0c;但是后面可能会改&#xff0c;比如去使用Access或Mysql或其他的&#xff0c;你觉得该怎么去设计这个代码呢&#xff1f;” 小明一脸所思&#xff0c…

亚马逊测评的重要性和技术选择

亚马逊测评是指卖家通过各种途径&#xff0c;如测评平台、社区、红人等&#xff0c;联系到亚马逊的买家&#xff0c;让其对卖家的产品进行评价和留下真实的综合评价&#xff0c;这对于跨境电商卖家来说非常重要&#xff0c;因为亚马逊的排名和转化率很大程度上取决于产品的评价…

什么是数据资产化?数据怎样成为资产?怎样进入资产负债表?

财政部发布的《企业数据资源相关会计处理暂行规定》将从2024年1月1日起开始实施&#xff0c;为企业数据资源入表提供了基本指引&#xff0c;数据资产化有望迎来爆发期。什么是数据资产化&#xff0c;怎样让数据成为资产&#xff0c;成为了众多国有企业、上市公司关心的问题。 —…

应用全局的UI状态存储AppStorage

目录 1、概述 2、StorageProp 2.1、观察变化和行为表现 3、StorageLink 3.1、观察变化和行为表现 4、从应用逻辑使用AppStorage和LocalStorage 5、从UI内部使用AppStorage和LocalStorage 6、不建议借助StorageLink的双向同步机制实现事件通知 6.1、推荐的事件通知方式…

KiCad 类型为电源输出和电源输出的引脚已连接

环境&#xff1a; KiCad 版本&#xff1a;7.0.6 操作系统版本&#xff1a;Win10 错误描述&#xff1a; KiCad 原理图 ERC 检查啊出现错误&#xff0c;错误提示下&#xff1a; 类型为电源输出和电源输出的引脚已连接。 错误原因&#xff1a; 电源输出和电源输出连接到了一起…

电商裂变营销的新策略:工会排队

电商行业已经发展了很多年了&#xff0c;一些基本的营销手段大家也是见识过的&#xff0c;比如&#xff1a;打折、满减、618、双十一、双十二等等。但是很多人把东西都屯到这种节日下单&#xff0c;算下来发现根本没便宜多少&#xff0c;有的反而更贵了&#xff0c;因为这是商家…

实在智能斩获钛媒体2023全球创新评选科技类「 大模型创新应用奖」

近日&#xff0c;历时三天的钛媒体2023 T-EDGE全球创新大会以“新视野新链接”为主题在北京隆重举办。作为科创领域全新高度的年度盛事&#xff0c;大会吸引了AI各产业链近百位海内外创投人、尖端企业家、商业领袖和国际嘉宾齐聚一堂&#xff0c;围绕新一轮AI革命、智慧数字化、…

AI时代Python量化交易实战:ChatGPT引领新时代

文章目录 《AI时代Python量化交易实战&#xff1a;ChatGPT让量化交易插上翅膀》关键点内容简介作者简介购买链接 《AI时代架构师修炼之道&#xff1a;ChatGPT让架构师插上翅膀》关键点内容简介作者简介 赠书活动 《AI时代Python量化交易实战&#xff1a;ChatGPT让量化交易插上翅…

【Mubert AI】快速自动生成免版税音乐

关于Mubert Mubert Mubert是一款很专业音乐创作工具&#xff0c;许多创作者和艺术家都在用它。 生成的音乐质量很高&#xff0c;使用方法也非常简单。 开始制作音乐 在主页选择“立即生成曲目”&#xff0c;无需登录立刻就可以进入音乐生成模式。 你可以根据需要&#xff0…

【模式识别】探秘判别奥秘:Fisher线性判别算法的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《模式之谜 | 数据奇迹解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f30c;1 初识模式识…

自动生成数控加工的轨迹刀具轨迹阿基米德螺旋线(3D)

文章目录 1. 阿基米德螺旋线2. 生成步骤目标: 基于点云自动生成阿基米德螺旋线轨迹点 针对的是半球形模型效果 1. 阿基米德螺旋线 阿基米德螺旋线(Archimedean spiral)是一种数学曲线,由古希腊数学家阿基米德(Archimedes)在公元前225年左右首次研究和描述。这条曲线的方…

Ubuntu 常用命令之 clear 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 clear命令在Ubuntu系统下用于清除终端屏幕的内容。这个命令没有任何参数&#xff0c;它的主要作用就是清理终端屏幕上的所有信息&#xff0c;使得屏幕看起来像是新打开的一样。 使用clear命令非常简单&#xff0c;只需要在终端中…

微前端样式隔离、sessionStorage、localStorage隔离

1、样式隔离 前端样式不隔离&#xff0c;会产生样式冲突的问题&#xff0c;这个点在qiankun也存在 子应用1修改一个样式 button {background: red&#xff01;important&#xff1b; }其它应用也会受到影响 qiankun的css隔离方案&#xff08;shadow dom&#xff09; shadow …

MySQL报错:1366 - Incorrect integer value: ‘xx‘ for column ‘xx‘ at row 1的解决方法

我在插入表数据时遇到了1366报错&#xff0c;报错内容&#xff1a;1366 - Incorrect integer value: Cindy for column name at row 1&#xff0c;下面我演示解决方法。 根据上图&#xff0c;原因是Cindy’对应的name字段数据类型不正确。我们在左侧找到该字段所在的grade_6表&…

分布式系统架构设计之分布式数据管理

随着互联网时代的不断发展&#xff0c;分布式系统架构成为支撑大规模用户和高并发访问的基础。在构建分布式系统时&#xff0c;分布式系统有着一系列的要求以及对应的核心技术&#xff0c;涉及到数据管理、通信安全性、性能优化、可扩展性设计以及架构演进与版本管理等很多方面…

[MTCTF 2022]easypickle

题目给了源码 import base64 import pickle from flask import Flask, session import os import randomapp Flask(__name__) app.config[SECRET_KEY] os.urandom(2).hex()app.route(/) def hello_world():if not session.get(user):session[user] .join(random.choices(&q…

【前端】前后端通信方法与差异(未完待续)

系列文章 【Vue】vue增加导航标签 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue&#xff0c;在Windows IIS平台…