Android ndk jni中回调java的方法&字段描述符

【Android JNI 开发入门指南】 交叉编译]在一个平台上去编译另一个平台上可以执行的本地代码。交叉编译的实现原理: 模拟不同平台的特性去编译代码。Android系统运行的 CPU 架构 :ARM,X86,mips[NDK (native Develop Kit),谷歌提供的: 用作JNI开发的交叉编译工具集。△安装介绍;如果电脑与JDK都是32位的则选择 android-ndk-r9d-windows-x86 的开发工具包。64为的则选择 android-ndk-r9d-windows-x86_64 的开发工具包。 阅读详情
一、jobject和jclass
1.如果定义native方法时使用了static关键字,那么生成的头文件里就会传入jclass,代表这个类的引用。
2.如果没有使用static关键字,那么就会传入jobject,代表类的对象的引用。
二、jni回调java

先贴代码
1.java

package com.example.testcallback;

import android.util.Log;

public class TestCallbackManager {
    private final String TAG = "TestCallbackManager";

    static {
        System.loadLibrary("TestCallback");
    }

    public native void start();

    public void myCallback(int a) {
        Log.e(TAG, "Callback: " + a);
    }

}

2.生成的头文件
ps:如果native方法定义成static,这里就不是jobject,而是jclass

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_testcallback_TestCallbackManager */

#ifndef _Included_com_example_testcallback_TestCallbackManager
#define _Included_com_example_testcallback_TestCallbackManager
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_testcallback_TestCallbackManager
 * Method:    start
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_testcallback_TestCallbackManager_start
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

3.c文件

#include <jni.h>
#include <android/log.h>
#include "com_example_testcallback_TestCallbackManager.h"

#define TAG "TestCallbackJNI"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)

JNIEXPORT void JNICALL Java_com_example_testcallback_TestCallbackManager_start
        (JNIEnv *env, jobject obj) {
    __android_log_print(ANDROID_LOG_ERROR, "Callback JNI", "begin");

    jclass clazz = (*env)->GetObjectClass(env, obj);
    jmethodID mID = (*env)->GetMethodID(env, clazz, "myCallback", "(I)V");
    (*env)->CallVoidMethod(env, obj, mID, 10);

    __android_log_print(ANDROID_LOG_ERROR, "Callback JNI", "end");
}

4.解释c文件
(1)在同一个类中,定义native方法和要调用的callback方法,为的是可以在当前的对象引用obj中找到当前类的引用,然后找到这个回调方法。
(2)GetObjectClass,通过obj找到当前类。
(3)GetMethodID找到回调方法,参数:env引用,类引用,方法名,字段描述符(这里看第四条)
(4)字段描述符:
  (a)JNI中描述字段使用字段描述符,描述方法同样有方法描述符。一个方法描述符包含参数类型和返回值类型。参数类型出现在前面,并由一对圆括号将它们括起来,参数类型按它们在方法声明中出现的顺序被列出来,并且多个参数类型之间没有分隔符。如果一个方法没有参数,被表示为一对空圆括号。方法的返回值类型紧跟参数类型的右括号后面。
  (b)描述符对应符号:
   Boolean~~~Z
   Byte~~~B
   Char~~~C
   Short~~~S
   Int~~~I
   Long~~~J
   Float~~~F
   Double~~~D
   Void~~~V
   
   objects对象:
   以”L”开头,以”;”结尾,中间是用”/” 隔开的包及类名。比如:Ljava/lang/String;。嵌套类:Ljava/xx/外部类名$内部类名;
  (c)方法描述符中可能会包含类描述符,如方法native private String getLine(String);的描述符为:“(Ljava/lang/String;)Ljava/lang/String;”
  (d)数组类型的描述符以“[”开头,后面跟着数组元素类型的描述符。如,public static void main(String[] args);的描述符是:”([Ljava/lang/String;)V”
  (e)举例:

// 描述符:(IFDZ)V
public void method1(int a,float f,double b,boolean b){
}

// 描述符:(Ljava/lang/String;)I
public int method2(String s){
    return 0;
}

//描述符:()[I
public int[] method3(){
    return null;
}

(5)CallVoidMethod 调用回调方法,并传入相应值。

Android NDK 开发 定义:NDK 是 Android SDK 的补充工具集,用于将 C/C++ 代码编译成.so(Shared Object,共享库)文件,供 Android 应用(Java/Kotlin)调用。核心作用复用现有 C/C++ 代码(如算法库、游戏引擎、硬件驱动)。提升性能敏感场景(如实时渲染、音视频处理、加密计算)的执行效率。访问 Android 平台的底层 API(如 OpenSL ES 音频、OpenGL ES 图形、传感器)。适用场景高性能计算(如数学建模、图像处理)。 阅读详情

相关推荐

Android NDK:在多线程中回调Java层方法

在Android开发中,我们经常需要在Native层使用多线程进行一些耗时操作,然后将结果回调到Java层进行处理。通过这种方式,我们可以在Native层使用多线程执行耗时操作,并将结果回调到Java层进行处理。首先,我们需要在Java层创建一个Native方法,用于在Native层调用Java层的回调方法。在Java层,我们需要将Native方法注册到JNI中,以便在Native层中能够正确地找到并调用它。在Java层,我们需要实现回调接口,并在其中处理从Native层传递过来的回调。

ByteKnight的博客 411

Android-NDK-hello-jniCallback

项目目录

CodeMyDream的专栏 478

Android NDK开发&mdash;&mdash;C回调Java中的方法

详情请参考我的博客 http://blog.youkuaiyun.com/allen315410/article/details/41862479

如何在android的jni线程中实现回调

JNI回调是指在c/c++代码中调用java函数,当在c/c++的线程中执行回调函数时,会导致回调失败。 其中一种在Android系统的解决方案是: 把c/c++中所有线程的创建,由pthread_create函数替换为由Java层的创建线程的函数AndroidRuntime::createJavaThread。 假设有c++函数: void *thread_entry(voi

达闻东的专栏 2万+

Cartographer全局重定位优化:无初始位姿约束的2万平工厂秒级定位实践

本文深入解析了Cartographer在2万平工业场景中的全局重定位优化实践,通过分支定界优化、子图动态加载和多传感器融合等关键技术,实现了无初始位姿约束下的秒级重定位。特别针对大场景下的快速重定位需求,优化后的系统在RK3588平台上表现出色,定位耗时从47秒降至1.8秒,成功率提升至91%,为工业自动化提供了高效解决方案。

rose2的博客 969

从Xilinx FPGA到MIPI DSI LCD屏:手撸代码的实战经验分享

本文分享了使用Xilinx FPGA驱动MIPI DSI LCD屏的实战经验。作者从依赖官方IP核失败,到与底层D-PHY IP缠斗,最终通过手撸代码,直接配置GTY收发器原语并实现完整的D-PHY与DSI协议栈,成功点亮屏幕。文章详细剖析了协议细节、Vivado工具链的调试技巧与避坑指南,为FPGA工程师提供了从理论到实践的宝贵参考。

weixin_29188997的博客 399

AndroidNDK JNI中调用java方法

android jni开发

Android8.x和Android9.x平台user版本打开UART输出并支持控制台输入和user版本adb root的方法 698

清华数据结构列车调度AC100分

两种思路(1)将目标栈的数据和待混洗的数据逐个进行比较#pragma warning(disable:4996) #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; #define maxn 1600005 using namespace std; char a[2*maxn][5];//记录操作命令 int stack[maxn]; char pop...

hgtjcxy的博客 924

使用NDK进行JNI编程与实践五:使用C/C++代码回调java类中方法

一、需求: 我们将本地方法和被调用的java类公共方法放在同一个类中,本地方法用于调用C/C++代码,在C/C++代码中实现逻辑,用于调用java中公共方法,公共方法中可添加打印之类的确认是否调用成功,逻辑梳理: java native method ---&gt; C/C++ method ---&gt; java public method 二、示例: 使用C++代码回调java的add函...

achina2011jy的博客 529

PLS-PM with R 偏最小二乘路径建模 (R语言)

1. 引入 1.1. 安装plspm包 plspm 是一个用于执行偏最小二乘路径建模分析的 r 程序包。 在 CRAN 上可以免费下载: Http://cran.r-project.org/web/packages/plspm/index.html. 此后,通过以下代码在r中安装并加载该程序包即可。 install.packages("plspm") library("plspm") 2. 一些简单概念 2.1. 潜变量和观测变量 不少变量如满意度、成功指数是无法通过观测得到

Wowlittlemoon的博客 1万+

【01】Canoe零基础手把手教学 --- Canoe安装

Canoe零基础手把手教学

jaytinlove的博客 7759

JNI/NDK入门指南之JNI多线程回调Java方法

     JNI/NDK入门指南之JNI多线程回调Java方法 背景   假设现在有这么一个业务需求,我们需要通过JNI在本地方法中干一件耗时操作,干完以后再通知Java层。这个实现逻辑非常简单,就是我们可以在本地方法中开启一个线程做函数操作,然后通过JNI回调Java方法。好了,架构已经定下来了,那么我们一步步实现。在实现过程中我也会将错误思路和实现代码提供出来,让大家正确的写法更加刻骨...

IT先森 8621

基于Python的电商平台商品信息爬取与价格监控系统设计与实现

本文详细介绍了一个基于Python的电商平台商品信息爬取与价格监控系统的设计与实现。系统采用最新的Python爬虫技术栈,包括Scrapy框架、Selenium自动化测试工具、BeautifulSoup解析库等,实现了对主流电商平台商品信息的自动化采集、存储、分析和可视化展示。文章从系统架构设计、关键技术实现、核心代码解析等方面进行了全面阐述,并提供了完整的代码实现。该系统不仅适用于毕业设计,也可作为商业价格监控系统的原型。关键词:Python爬虫;电商数据采集;价格监控;Scrapy;Selenium;

2201_76125261的博客 963

JNI/NDK入门指南之正确姿势了解JNI和NDK

         你真的了解Android中JNI/NDK吗?    随着Android生态的发展,越来越多的行业开始使用Android操作系统,这就造就了对Android设备的应用性能和安全要求越来越高,随之而来的对JNI/NDK开发的需求也越来越大。虽然网上或者很多书籍都有关于此方面的讲解,但是都是上来直奔主题说怎么使用JNI/NDK,而没有将啥是JNI和NDK讲解清楚。所以导致很...

IT先森 3569

Python爬虫实战:高效爬取中国版权登记数据

本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的中国版权登记数据爬虫系统。我们将使用Playwright+Asyncio实现无头浏览器自动化,结合Redis分布式任务队列和MongoDB数据存储,打造一个能够应对反爬机制的企业级数据采集方案。文章包含完整代码实现、性能优化技巧以及法律合规建议,帮助开发者快速掌握大规模数据采集的核心技术。本文详细介绍了2024年使用Python最新技术栈构建中国版权登记数据爬虫的完整方案。基于Playwright的无头浏览器自动化。

2201_76125261的博客 1898

YOLOv11改进 | 注意力篇 | YOLOv11引入CA注意力机制

摘要:最近关于移动网络设计的研究已经证明了通道注意力(例如,挤压和激励注意力)对于提升模型性能的显着有效性,但它们通常忽略了位置信息,而位置信息对于生成空间选择性注意力图很重要。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~3.2 在Extramodule里创建CA。在CA.py文件里添加给出的CA代码。

tsg6698的博客 2979

ndk回调java_Android NDK 线程回调Java层方法

项目上刚好要在Android NDK层使用线程回调Java层方法,仅以此文做个总结。线程使用pthread创建(在此略过),线程会循环调用NofityDataCB函数:static JavaVM* s_jVM = NULL;static jobject s_jobj = NULL; //java objectstatic jmethodID s_jcallback = NULL; //方法idst...

weixin_42136826的博客 545

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jni回调java类中函数_NDK开发:JNI回调函数的实现

#include #include #include #define _JNI_VERSION JNI_VERSION_1_4#define THREAD_NAME "lib_hello_jni"JNIEnv *jni_get_env(const char *name);/* * Pointer to the Java virtual machine * Note: It's okay to us...

weixin_29474431的博客 1261

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

NDK开发第三章 JNI-Callback

本章所学到的知识 jni创建java对象 jni调用java静态方法 创建linux线程 jni线程锁 jni回调java对象方法 /* * A function calling from JNI to update current timer * 此处注解,防止编译器删除 */ @Keep private void updateT...

zhangfy068的专栏 1601

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

第九章 JNI

文章目录第九章 JNI一.JNI与NDK简介1、JNI(协议)(1)定义(2)作用2、NDK(工具)(1)定义(2)作用(3)特点3、JNI与NDK关系二.具体使用(1)NDK集成开发流程1、配置Android NDK环境2、关联Android Studio项目与NDK3、创建JNI类声明native方法4、生成.h文件5、创建本地代码文件6、创建Android.mk文件 &amp; Applic...

Stay Hungry Stay Foolish 求知若饥 虚心若愚 4138

JNI/NDK入门指南之javah和javap的使用和集成

     JNI/NDK开发指南之javah和javap的使用和集成   在前面的章节JNI/NDK开发指南之JNI数据类型,描述符详解中我们详细的讲解了数据类型,描述符等相关的概念。如果是刚开始接触JNI的话,读者看到那些概念都会懵逼了,哇开发一个JNI的端咋这么多需要记忆的概念,描述符啊,数据类型啊,签名啊?其实JDK的开发工具为我们提供了一些快捷的工具如javah和javap,这两个...

IT先森 2010

JNI/NDK入门指南之C/C++通过JNI访问Java实例方法和类静态方法

 JNI/NDK入门指南之C/C++通过JNI访问Java实例方法和类静态方法   在前面的章节JNI/NDK入门指南之C/C++通过JNI访问Java实例属性和类静态属性中讲解了C/C++通过JNI对Java实例属性和静态属性的访问。今天我们继续向JNI的知识海洋进军讲解C/C++通过JNI访问Java通过JNI访问Java实例方法和类静态方法的处理。本章内容有点多哦,所以读者务必上好厕所,搬个...

IT先森 2576

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

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

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

JNI/NDK入门指南之调用Java构造方法和父类实例方法

   JNI/NDK入门指南之调用Java构造方法和父类实例方法 前言   在前面的章节我们学习了JNI/NDK入门指南之C/C++通过JNI访问Java实例属性和类静态属性和JNI/NDK入门指南之C/C++通过JNI访问Java实例方法和类静态方法,其中都有讲到调用构造函数来实例化一个对象,但是都没有详细介绍过,只是讲了一个大概的用法。在本章我们将深入挖掘,分别介绍一下初始化一个对象的两种方...

IT先森 1991

Android使用JNI实现Java与C之间传递数据

介绍Java如何将数据传递给C和C回调Java的方法。  java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java。C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需要调用java的方法。 Android中使用JNI七个步骤: 1.创建一个android工程 2.JAVA代码中写声明native 方法 public native String helloFr

文忠专栏 4万+
下一篇: Android ndk 将C语言main方法转为JNI调用
MagicWZQ
博客等级 码龄10年 3粉丝 3原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值