【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类属性值;

HWSD全球土壤数据下载、处理与提取完整指南

全球尺度的科学研究与工程项目中,土壤数据是必不可少的基础底图,而HWSD(和谐世界土壤数据库)凭借其统一的分辨率与属性标准,成为农业区划、生态模型、土地利用变化和水资源评估等领域的通用数据源。深入理解其“栅格存编号、数据库存属性”的核心原理,是高效使用这套数据的关键。通过掌握MDB数据库结构、属性字段含义以及栅格与属性表的关联方法,研究者可以将原始数据转化为可用的研究底图。无论你是需要提取特定区域的土壤属性,还是进行面积统计与点位采样,合理的处理流程都能显著提升工作效率。本文从下载注册开始,一步步梳理数据清

weixin_29056781的博客 315

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

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

realAsker的专栏 2456

Mac上安装虚拟机搭载window系统

用Mac的都知道,很多window用的软件是Mac版本没有的。平时有的还得要求去用那些软件,有几种方式可供大家选择: 1.再买个window本; 2.装双系统; 3.装虚拟机,搭载window系统。 我比较推荐第3条,这样可以在Mac本上做到双开,一边开着mac一边开着window,还能做到同时处理文件,不至于重新启动操作系统,下边是具体实现步骤,其中有几个需要下载的,建议在网速好的时候完...

Coder_Mumu的博客 1万+

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

OpenSees入门指南:从零开始的环境配置与TCL脚本实战

本文提供了一份详细的OpenSees入门指南,涵盖从零开始的环境配置到TCL脚本实战的全过程。文章重点讲解了OpenSees的安装步骤、环境变量设置,并推荐了高效的VS Code集成开发环境配置方法。通过一个简支梁分析的完整TCL脚本示例,手把手引导读者完成第一个非线性有限元分析,帮助土木工程与结构工程领域的研究者与学生快速上手这一强大的开源分析工具。

weixin_28829339的博客 336

MOS管关断时尖峰电压的5种实用抑制方案(附实测数据对比)

本文针对MOS管关断时产生的尖峰电压问题,提供了五种经过实验室实测验证的实用抑制方案。文章从尖峰电压的成因分析入手,详细阐述了优化PCB布局、设计RC缓冲电路、选用TVS二极管钳位、调节驱动电路以及使用磁珠吸收高频振荡等方法的原理、实施步骤与实测数据对比,为硬件工程师解决开关电源和电机驱动中的过压应力与EMI问题提供了系统性的实战指南。

1240

java创建多线程的几种方式

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

张俊杰 的博客 585

uniapp(全端兼容) - 最新详细实现pdf在线预览功能,uniapp内置预览PDF文件功能,uniapp在安卓app|苹果app|h5网页网站|微信小程序中打开pdf进行在线预览(详细示例源码)

uni-app,安卓Android,苹果ios,App端,H5网页,移动端网站,微信小程序,支付宝小程序,nvue,vue,pdf文档,pdf文件,office,uniapp 预览pdf,uniapp怎么做pdf预览,uniapp如何实现全平台兼容的pdf在线预览,uniapp怎么在h5打开pdf文档,实现PDF在线预览,H5移动端文件预览pdf,文件下载和预览,uniapp App端pdf文件预览,app移动端在线预览pdf文件,无法预览pdf怎么办,有没有预览pdf的插件,根本打不开咋办,uniapp使

✅ 精选推荐文章 1万+

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

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

Jingle的专栏 1304

在 SAP HANA 与 HANA Cloud 中,用 SQL DDL 创建数据库视图:从设计时工件到运行时对象的全链路实践

本文介绍了在SAP HANA中通过HDI容器使用DDL定义视图的方法。主要内容包括:1)采用.hdbview设计时工件存储视图定义,构建时自动转换为运行时视图,实现版本控制和权限隔离;2)开发前需准备HDI容器、MTA项目及配置.hdiconfig文件;3)详细说明.hdbview语法结构,重点讲解WITH READ ONLY和WITH STRUCTURED PRIVILEGE CHECK的使用场景;4)提供了从创建文件到构建验证的完整流程示例;5)强调跨容器访问时需通过.hdbgrants为#OO用户授予

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 275

使用 Simulink 进行电力电子系统的效率优化仿真

电力电子系统(Power Electronics System)是现代电力系统和工业自动化中的关键组成部分,广泛应用于可再生能源发电、电动汽车、不间断电源(UPS)、电机驱动等领域。为了提高系统的整体性能和经济性,必须对电力电子系统的效率进行优化。效率优化的目标是最大化系统的能量转换效率,减少损耗,从而提高系统的可靠性和经济效益。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电力电子系统的效率优化策略。本教程将详细介绍如何使用 Simulink 进行电力电子系统的效率优化仿真。

xiaoheshang_123的博客 355

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

【QT开发教程】Qt中的跨平台文件系统操作

文件系统操作是应用程序开发中经常需要处理的任务。Qt提供了一套跨平台的文件系统操作API,使开发者能够在不同操作系统上无缝地进行文件和目录操作。本文将介绍Qt中的跨平台文件系统操作,包括基本概念、常用类和方法以及实际示例。

科技改变人类,技术成就未来 981

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

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

qq_27302885的博客 697

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

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

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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、付费专栏及课程。

余额充值