【JNI开发】C++调用java函数的实现方法

Android随笔-JNI JNI:Java Native Interface,即Java本地接口,使Java与其他类型的语言进行交互,和C/C++交互的比较多。JNI属于Java的一部分,是JDK的组成部分,和Android关系不大,但是Android中核心的业务或高性能的功能都是C/C++开发的,比如游戏渲染、音视频编解码等,所以对于Android开发,JNI也是需要了解的。Android中并不是直接和C/C++打交道,是和.so(动态库),.a(静态库)文件打交道。... 阅读详情

本文的主要内容:C++中调用java类的成员函数和静态成员函数


1,java代码

public class SNaviEngineManager {

    public void sendMessage(int msg)
    {

    }

    public static int sendMessage(int msg)
    {

    }	

}

2,c++代码

调用成员函数

void ms_sendmessage(int msg)
{
	
	// 获取JNI环境
	bool attach = false;
	int status=0;
	JNIEnv* pEnv = NULL;
	status = g_jvm->GetEnv((void **) &pEnv, JNI_VERSION_1_6);  
	if( status < 0 )
	{
		LOGI("AttachCurrentThread");
		g_jvm->AttachCurrentThread(&pEnv, NULL);
		attach = true;
	}

	jmethodID mid = pEnv->GetMethodID( g_jcNaviEngine, "<init>", "()V");  
        jobject obj = pEnv->NewObject( g_jcNaviEngine, mid);
	if (obj == 0)  
	{  
		LOGE("Create object failed!");  
         }  

	// 调用成员方法  
        mid = pEnv->GetMethodID( g_jcNaviEngine, "sendMessage", "(I)V");
	if (mid != 0)  
	{  
		pEnv->CallVoidMethod( obj, mid, msg );	
	} 

	
	// 释放JNI环境
	if( attach )
	{
		g_jvm->DetachCurrentThread();
	}
}

调用静态成员函数

void ms_sendmessage(int msg)
{
	
	// 获取JNI环境
	bool attach = false;
	int status=0;
	JNIEnv* pEnv = NULL;
	status = g_jvm->GetEnv((void **) &pEnv, JNI_VERSION_1_6);  
	if( status < 0 )
	{
		LOGI("AttachCurrentThread");
		g_jvm->AttachCurrentThread(&pEnv, NULL);
		attach = true;
	}
 

	// 调用静态成员方法  
        jmethodID mid = pEnv->GetStaticMethodID( static_cast<jclass>(g_joNaviEngine), "sendMessage", "(I)V");
	if (mid != 0)  
	{  
		pEnv->CallStaticVoidMethod( obj, mid, msg );	
	} 

	
	// 释放JNI环境
	if( attach )
	{
		g_jvm->DetachCurrentThread();
	}
}

【注意】

在调用java类的成员函数时,一定要调用构造函数实例化java类

/** 实例化类对象 */
jobject getInstance( JNIEnv* pEnv , jclass classzz )
{
	if ( pEnv == NULL )
	{
		return NULL ;
	}

	// 获取构造方法
	jmethodID constructor = pEnv->GetMethodID(classzz, "<init>", "()V"); 
	if (NULL == constructor) 
	{ 
		return NULL;
	}   
	// 实例化类对象  
	return pEnv->NewObject(classzz, constructor); 
}



【我的C/C++语言学习进阶之旅】JNI开发之转换C层返回的结构体为Java实体Bean 在我之前的博客介绍了如何传Java对象到C++层代码。今天和算法联调的时候,调用算法返回的结果是一个Struct结构体,然后我需要将将构体转换为Java对象Bean返回给Java业务层,因此记录一下怎么转换的。 阅读详情

相关推荐

Java本地接口(JNI)

JNI的本意是Java Native Interface(Java本地接口),是为了方便Java和C/C++等本地代码所封装的一层接口,使用JNI技术可以对Java层屏蔽不同操作系统平台之间的差异,从而实现Java本身的平台无关特性。JNI和Android是没有关系的。通过JNI可以做到以下两点:1、Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++写的函数。2、Native程序中的函数可以调用Java层的函数,即C/C++程序中可以调用Java的函数。

武天旭的博客 735

【NDK】【020】JNI线程切换、AttachCurrentThread、DetachCurrentThread

JNI线程绑定的普通用法 JNIEnv *env = nullptr; jvm->AttachCurrentThread(&env, nullptr); env->CallVoidMethod(obj, onErrorMethod, -1); jvm->DetachCurrentThread(); 普通用法的缺陷 如果子线程是在C++中创建的,然后通过以上代码来执行Java回调,则没有任何问题 但如果子线程是在Java代码中创建的,Java调用了C++代码,C++代码

天天向上 Up Up Up (*^▽^*) 5509

3.jni_c++调用java中的方法

jni_c++调用java中的方法 文档中包含(c++与js互相调用的实现)

C/C++如何调用Java

简单介绍C/C++如何调用Java,内容适合未接触过此类工程的朋友作为上手参考。

qq_42136261的博客 6592

JNI中C代码调用使用java属性和方法

从事NDK必经之路,根据文档快速入手,体验c代码如何调用java方法,和修改java类属性值;

TwinCAT3 主站动态配置 PDO 的实战技巧与性能优化

本文深入探讨了TwinCAT3主站动态配置PDO的实战技巧与性能优化策略。通过对比静态PDO的局限,阐述了动态配置在提升系统灵活性、降低网络负载和保障实时性方面的核心优势。文章提供了从环境准备、代码实现到错误排查的完整流程,并重点解析了PDO映射、SDO通道区别以及分布式时钟同步等关键概念,帮助工程师掌握EtherCAT网络性能调优的核心方法。

weixin_29213525的博客 346

利用VC++6.0实现JNI的最简单的例子

如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用VC++6.0实现JNI的最简单的例子 JNI入门教程之HelloWorld篇 SUN JNI Tutorial这些资料的例子中,大多数只是输入一些简单的参数,获取没有参数。而在实际的使用过程中,往往需要对参数进行处理转换。才可以被C/C

realAsker的专栏 2456

基于图像形态学处理的交通灯检测识别matlab仿真

图像形态学处理是基于数学形态学的理论,利用结构元素(如矩形、圆形等)对图像进行处理,通过将结构元素与图像进行特定的逻辑运算,来提取图像中的目标特征、去除噪声、改善图像质量等。在交通灯检测识别中,主要利用交通灯的颜色、形状等特征,通过形态学操作突出这些特征,抑制背景和噪声干扰,从而实现对交通灯的准确检测和识别。图像采集与预处理采集:通过安装在车辆或道路上的摄像头获取交通场景图像。灰度化:将彩色图像转换为灰度图像,减少数据量,便于后续处理。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 160

jni 获取java类,JNI(C/C++调用Java父类/子类步骤)

JNI(C/C++调用Java父类/子类方法)back>>1. C/C++调用Java函数的形式- 调用实例方法的三种形式CallMethod(jobject obj,jmethodID id,....);CallMethod(jobject obj,jmethodID id,va_list lst);CallMethod(jobject obj,jmethodID id,jvalue...

weixin_36292971的博客 523

功能安全Safety Case构建方法论

本文系统阐述了功能安全认证中SafetyCase的构建方法。SafetyCase是一套结构化论证体系,通过Claim-Argument-Evidence(CAE)逻辑链证明系统安全性,包含系统级、技术安全级和实现级三层论证。文章详细介绍了SafetyCase的核心框架、与FMEDA等验证方法的关系、工程化实施步骤,以及常见失效模式。特别强调SafetyCase连接理论、实现与证据的桥梁作用,是功能安全认证的灵魂文件,要求将分散的安全活动组织成完整的逻辑论证。

VehSwHwDeveloper的博客 577

020、Sensor 供电设计:AVDD、DVDD、IOVDD 的上电时序与纹波要求

本文总结了图像传感器(Sensor)供电设计中的关键要点与常见问题:1. 三路供电特性差异:AVDD(模拟供电)对纹波最敏感(通常<30mVpp),DVDD需应对大电流瞬态变化,IOVDD需满足MIPI接口电压稳定要求。2. 上电时序至关重要,应遵循"模拟→数字→IO"的启动顺序,时序偏差可能导致初始化失败。3. 纹波控制需合理选择电容组合(如10μF+0.1μF),注意布局走线及电容ESR/ESL特性。4. 调试建议使用示波器多通道测量时序和纹波,重点关注传感器启动瞬间的电源特性。5. 经验教训包括预留设

sundong_81的博客 526

java创建多线程的几种方式

提示 需要注意的是,无论用何种方式创建启动线程,都要给它一个名字,这对排错诊断系统监控有帮助,否则诊断问题时,无法直观知道某个线程的用途. 继承Thread类 MyThread类 public class MyThread extends Thread { public MyThread() { } //private String name; MyThread(String name) { //this.name = name; super(name); } @Override

张俊杰 的博客 585

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

|~~~热爱生活、努力学习的小伙汁~~~| 2109

Android JNI学习笔记(二)-动态注册native函数

1.前言 在很久之前的一篇Android 开发艺术探索的笔记当中,学习了简单的jni开发流程,但是那会的步骤极其繁琐复杂,而且生成的头文件函数太长,那么,有没有方法能解决呢,让开发过程变得简单易懂。当然是有的,那就是今天的主角。JNI_OnLoad函数。顺便说一下,现在as对 jni开发的支持是越来越好了。 2. 首先声明native函数 现在,我在activity里声明了一

Jingle的专栏 1304

Cesium 实现动态加载气象数据:渲染成动态雨雪/云层效果(源码 + 原理)

本文介绍了在Cesium中实现动态天气效果的技术方案。核心思路是通过时间轴驱动多层数据动态切换,包括:1)时间维度处理,按序列加载不同气象图层;2)空间维度处理,将气象数据切分为瓦片;3)效果层实现,制作风场、降水等动态可视化效果。文章详细讲解了后端数据预处理(生成瓦片和风场JSON)、前端实现(双层雷达瓦片交替渐变、风场粒子系统)的具体方法,并提供了完整的代码示例。此外还探讨了雨雪粒子、云层效果等增强功能,以及工程化建议,为构建科学准确的动态天气可视化系统提供了实用解决方案。

专注AI大模型,软件混淆,授权 623

YOLOv11 改进入门篇 | 轻量级涨点技巧:GhostConv 替代普通卷积的实战指南

摘要: 本文介绍如何通过GhostConv改进YOLOv11,实现轻量化涨点。YOLOv11深度增加导致参数量、延迟和内存占用上升,GhostConv通过“本征特征+线性变换”策略,在精度几乎无损的情况下降低30%-50%计算量。文章详细解析GhostConv原理,对比普通卷积的参数量和FLOPs优势,并提供完整的代码级改造流程,包括模块实现、注册及网络配置。实验表明,该方法有效提升边缘端推理效率,适用于移动端等资源受限场景。

shrgegrb的博客 1655

JNI调用及Android Studio配置说明(Cmake方式)

Android开发时经常会遇到Java调用C/C++代码,这时需要使用到JNI,下面详细介绍C/C++代码封装成JNI库。 1. 配置ndk环境 打开Andrid studio的File->Settings->Appearance & Behavior->System Settings->Android SDK的SDK Tools中下载NDK和Cmake。此时需要注意到下载地址,ndk一般在sdk的目录下的ndk文件夹中。 ...

小罗卜的博客 498

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++学习之打车软件JNI编程

C++学习之打车软件JNI编程

qq_27302885的博客 697

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

c jni 调用java_JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程

//1.引入Jni头文件#include #include#include#include//处理日志打印//------------------------------------日志处理-----------------------------------#define LOG_TAG "JNILogTag"//不带格式log#define LOGI(...) __android_log_pr...

weixin_30272849的博客 202

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jni 调用java类方法_JNI之C++调用Java类

Java类需要在虚拟机上运行,也就不是原生的,同样.NET Framework也不是原生的。JNI也就是Java原生接口。关于JNI的规范,以及为什么要使用它,它能做些什么,都在http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/jniTOC.html里记述着。JNI是规范,它规定了虚拟机的接口,而把具体的实现留给开发者。JVM的实现不是唯一的,...

weixin_29701553的博客 251

java jni 博客_Java JNI简单实现

Java JNI简单实现JNI(Java Native Interface)允许了Java和C&C++进行交互?这不折腾人嘛!一、JNI简述二、JNI基本类型copy表一份,很详细的了!Java类型本地类型描述booleanjbooleanC/C++8位整型bytejbyteC/C++带符号的8位整型charjcharC/C++无符号的16位整型shortjshortC/C++带符号的16...

weixin_36071439的博客 124

Android下如何通过JNI方法向上提供接口总结

参考文献: http://blog.youkuaiyun.com/luoshengyang/article/details/6575988 http://www.androidmi.com/Androidkaifa/rumen/201005/633.html 1 什么是JNI JNI是Java Native Interface的缩写,即Java本地接口.从Java1.1开始,JNI标准成为Ja

放飞梦想,成就未来 1万+

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

第一个JNI开发

在Eclipse开发C/C++环境配置中我们介绍了Eclipse开发C/C++的环境配置。在Android的开发中,有时我们需要使用JNI的形式来开发。谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK。而在NDKr7开始,Google的Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就

语音博客知识 331

【cocos2d-x】C++中调用JAVA的方法

CPP文件中(以HelloWorld为例): 1、 首先导入h文件: #include "../platform/android/jni/JniHelper.h" 2、 在需要调用JAVA方法的地方,加入如下代码: #if (CC_TARGET_PLATFORM== CC_PLATFORM_ANDROID) //判断当前是否为Android平台 JniMethodInfo minfo

Macuilxochitl 1292
上一篇: 百度地图和谷歌地图的比例尺和分辨率
下一篇: Java中为什么要用抽象类来实现接口
mnorst
博客等级 码龄16年 38粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值