CN107832056A - 基于jni的c++中java函数调用方法 - Google Patents

基于jni的c++中java函数调用方法 Download PDF

Info

Publication number
CN107832056A
CN107832056A CN201711336832.0A CN201711336832A CN107832056A CN 107832056 A CN107832056 A CN 107832056A CN 201711336832 A CN201711336832 A CN 201711336832A CN 107832056 A CN107832056 A CN 107832056A
Authority
CN
China
Prior art keywords
jni
template
java
signature
function
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201711336832.0A
Other languages
English (en)
Other versions
CN107832056B (zh
Inventor
李波
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Suzhou Snail Digital Technology Co Ltd
Original Assignee
Suzhou Snail Digital Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Suzhou Snail Digital Technology Co Ltd filed Critical Suzhou Snail Digital Technology Co Ltd
Priority to CN201711336832.0A priority Critical patent/CN107832056B/zh
Publication of CN107832056A publication Critical patent/CN107832056A/zh
Application granted granted Critical
Publication of CN107832056B publication Critical patent/CN107832056B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

一种C++与JAVA函数相互调用方法,包括以下步骤:使用C++可变参数模板和模板特化,实现编译期JNI数据类型签名的字符串值字面对象,并预置JNI支持的数据类型签名,建立JNI接口;调用JAVA函数后,使用C++可变参数模板和模板特化实现C++、JNI直接的数据类型转换和生成函数签名;进行函数执行结果从JNI数据类型转换为C++数据类型,最终返回结果。采用本发明的方法,实现C++、JAVA无缝调用,并隐藏了JNI的调用过程,开发人员不必去学习JNI开发也不必去编写沉长的JNI函数调用签名也能完成C++与JAVA的交互,大大减少工作量并提高程序的可维护性和稳定性,节省人力成本。

Description

基于JNI的C++中JAVA函数调用方法
技术领域
本发明涉及一种跨语言函数调用方法,尤其涉及基于JNI(Java NativeInterface)的C++中JAVA函数调用方法。
背景技术
在进行跨平台开发中,为了能够实现代码的高度复用,往往都会使用C++来开发核心功能,然后使用各个平台原生语言来实现核心功能与平台的交互,比如android游戏开发,核心游戏逻辑使用C++开发,平台部分使用Java开发。因为游戏是在平台之上运行的,所以游戏逻辑和平台肯定会有所交互,目前C++和JAVA主流的交互方法是使用JNI来调用JAVA函数,但是要真正的实现调用,开发人员必须清楚C++数据类型、JNI数据类型、JAVA数据类型并且还需要了解这些类型是如何对应和转换的,并且还需要清楚的知道如何编写JNI函数签名。而且编写具体交互逻辑的时候的步骤为:
步骤①.通过C++、JNI、JAVA数据类型的映射关系手动编写函数签名。
步骤②.手动编写C++、JNI、JAVA每一种数据类型的转换。
步骤③.查找函数并调用。
步骤④.手动转换函数返回结果。
以上步骤为每调用一个函数都要写一遍。随着函数数目增加,工作量和代码维护量将大幅增加,同时出错的概率也大大增加。
发明内容
为了解决现有技术存在的问题,本发明提供一种基于JNI的C++中JAVA函数调用方法。
本发明的目的通过以下技术方案来实现:
基于JNI的C++与JAVA调用方法,其包括以下步骤:
使用C++可变参数模板和模板特化,实现编译期JNI数据类型签名的字符串值字面对象,并预置JNI支持的数据类型签名,建立JNI接口;
调用JAVA函数后,使用C++可变参数模板和模板特化实现C++、JNI直接的数据类型转换和生成函数签名;
进行函数执行结果从JNI数据类型转换为C++数据类型,最终返回结果。
上述的基于JNI的C++中JAVA函数调用方法,其中:所述的实现编译期字符串字面对象的实现原理为利用C++可变参数模板的特性以及模板特化特性实现模板递归,每一层递归保存一个静态字符,最终整套递归就是一个完整的字符串字面值对象。JNI数据类型是有限的,然后通过编译期字符串字面对象预置JNI数据类型签名。以供通过C++对象映射JNI对象。本发明提供一套JNI接口,用于给开发人员调用java函数,通过C++模板实现模板递归和特化,实现JNI数据类型签名字符串字面值对象,并预置JNI支持的数据类型签名,开发人员调用JAVA方法后,使用C++模板特化和可变参数特性推导出参数对应的JNI数据类型签名字符串字面值对象,使用模板递归连接数据类型签名生成最终的函数签名。该操作是在程序编译期完成的。如果使用的数据类型不被支持,编译将不会通过。通过自动生成的函数签名调用JNI接口查找函数,找到函数后,使用可变参数模板和模板特化实现C++到JNI的数据类型转换,使用转换过后的参数进行函数调用,并自动进行函数执行结果从JNI数据类型转换为C++数据类型,最终返回结果。
C++ 与JNI数据类型相互转换的实现原理为,通过模板特化,由编译器推导出数据类型对应的模板特化,具体数据具体转换。
本发明的优点主要体现在:不必具体去了解JAVA、JNI数据类型,只需要了解程序接口说明文档。自动进行C++、JNI之间的数据类型转换,自动生成函数签名,自动查找并调用JAVA函数并返回函数执行结果,采用本发明的方法,开发人员不用再去了解JNI和Java的数据类型,不必编写沉长数据类型转换,不必学习JNI开发,不必编写每个Java函数的签名。这一切都由本发明自动完成,开发人员可能只需要调用一个接口就能完成上面的所有功能。大大减少工作量并提高程序的可维护行和稳定性,节省人力成本。
具体实施方式
本发明的目的、优点和特点,将通过下面优选实施例的非限制性说明进行解释。这些实施例仅是应用本发明技术方案的典型范例,凡采取等同替换或者等效变换而形成的技术方案,均落在本发明要求保护的范围之内。
下面对本发明的基于JNI的C++中JAVA函数调用方法进行详细描述,
首先,在步骤①. 通过C++可变参数模板特性实现编译期字符串值字面对象。在该步骤中,使用C++模板实现模板递归和特化,生成保存JNI数据类型签名的字符串字面值对象。
在步骤②. 通过C++模板元编程特化出C++数据类型到JNI数据的映射关系和转换函数。
在步骤③. 通过C++模板元编程特化出JNI数据类型到C++数据类型的映射关系和转换函数。
在步骤④. 通过C++模板元编程特化出C++数组类型到JNI数组类型的转换函数。
在步骤⑤. 通过C++可变参数模板特性和模板特化实现C++与JNI不定参数函数的调用。
在步骤⑥. 开发人员调用JAVA方法的时候,传入JAVA的类路径,方法名,以及参数(C++类型),根据参数的个数和类型自动推导出参数签名,根据返回值类型推导出返回值签名,然后通过参数签名和返回值签名组成了函数签名。
在步骤⑦. 通过函数签名调用JNI接口查找JAVA函数。
在步骤⑧. 找到JAVA函数后,使用C++可变参数模板和模板特化实现C++到JNI的数据类型转换,使用转换过后的JNI的数据类型进行JAVA函数调用。
在步骤⑨. 自动进行函数执行结果从JNI数据类型转换为C++数据类型,最终返回结果。
所述的实现编译期字符串字面对象的实现原理为利用C++可变参数模板的特性以及模板特化特性实现模板递归,每一层递归保存一个静态字符,最终整套递归就是一个完整的字符串字面值对象。JNI数据类型是有限的,然后通过编译期字符串字面对象预置JNI数据类型签名。以供通过C++对象映射JNI对象。
本领域普通技术人员可以理解:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (4)

1.一种基于JNI的C++中JAVA函数调用方法,包括以下步骤:
使用C++可变参数模板和模板特化,实现编译期JNI数据类型签名的字符串值字面对象,并预置JNI支持的数据类型签名,建立JNI接口;
调用JAVA函数后,使用C++可变参数模板和模板特化实现C++、JNI直接的数据类型转换和生成函数签名;
进行函数执行结果从JNI数据类型转换为C++数据类型,最终返回结果。
2.根据权利要求1所述的基于JNI的C++中JAVA函数调用方法,其特征在于,所述实现编译期JNI数据类型签名的字符串值字面对象的步骤,包括,利用C++可变参数模板的特性以及模板特化特性实现模板递归,每一层递归保存一个静态字符,最终整套递归就是一个完整的字符串字面值对象;通过编译期字符串字面对象预置JNI数据类型签名,以供通过C++对象映射JNI对象。
3.根据权利要求1所述的基于JNI的C++中JAVA函数调用方法,其特征在于,所述使用C++可变参数模板和模板特化实现C++、JNI直接的数据类型自动转换的步骤,进一步包括,
通过C++模板元编程特化出C++数据类型到JNI数据的映射关系和转换函数;
通过C++模板元编程特化出JNI数据类型到C++数据类型的映射贵姓和转换函数;
通过C++模板元编程特化出C++数组类型到JNI数组类型的转换函数;
通过C++可变参数模板特性和模板特化实现C++与JNI不定参数函数的调用。
4.根据权利要求1所述的基于JNI的C++中JAVA函数调用方法,其特征在于,所述生成函数签名,进一步包括,在调用JAVA方法时,传入JAVA的类路径,方法名,以及参数(C++类型);根据参数的个数和类型推导出参数签名,根据返回值类型推导出返回值签名;然后通过参数签名和返回值签名组成了函数签名。
CN201711336832.0A 2017-12-14 2017-12-14 基于jni的c++中java函数调用方法 Active CN107832056B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201711336832.0A CN107832056B (zh) 2017-12-14 2017-12-14 基于jni的c++中java函数调用方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201711336832.0A CN107832056B (zh) 2017-12-14 2017-12-14 基于jni的c++中java函数调用方法

Publications (2)

Publication Number Publication Date
CN107832056A true CN107832056A (zh) 2018-03-23
CN107832056B CN107832056B (zh) 2020-12-18

Family

ID=61644483

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201711336832.0A Active CN107832056B (zh) 2017-12-14 2017-12-14 基于jni的c++中java函数调用方法

Country Status (1)

Country Link
CN (1) CN107832056B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108804243A (zh) * 2018-05-23 2018-11-13 北京五八信息技术有限公司 一种交互方法、装置、计算机设备及计算机可读存储介质
CN109840093A (zh) * 2018-12-24 2019-06-04 苏州蜗牛数字科技股份有限公司 一种任意函数适配器实现方法
CN113407190A (zh) * 2021-06-16 2021-09-17 武汉光庭信息技术股份有限公司 Android系统与汽车ECU模块通信数据序列化和反序列化方法及系统
CN115080006A (zh) * 2021-03-15 2022-09-20 武汉斗鱼网络科技有限公司 一种数据调用方法及相关设备

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6066181A (en) * 1997-12-08 2000-05-23 Analysis & Technology, Inc. Java native interface code generator
CN1746844A (zh) * 2005-09-29 2006-03-15 浪潮电子信息产业股份有限公司 一种跨操作系统平台的机群系统监控和管理方法
CN105279033A (zh) * 2014-07-22 2016-01-27 Tcl集团股份有限公司 Android平台下C++和Java通信的方法及系统
CN106502668A (zh) * 2016-10-20 2017-03-15 武汉斗鱼网络科技有限公司 一种实现Android JNI反射的接口封装方法及系统

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6066181A (en) * 1997-12-08 2000-05-23 Analysis & Technology, Inc. Java native interface code generator
CN1746844A (zh) * 2005-09-29 2006-03-15 浪潮电子信息产业股份有限公司 一种跨操作系统平台的机群系统监控和管理方法
CN105279033A (zh) * 2014-07-22 2016-01-27 Tcl集团股份有限公司 Android平台下C++和Java通信的方法及系统
CN106502668A (zh) * 2016-10-20 2017-03-15 武汉斗鱼网络科技有限公司 一种实现Android JNI反射的接口封装方法及系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
罗夏朴等: "java与c/c++互操作的研究", 《微型机与应用》 *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108804243A (zh) * 2018-05-23 2018-11-13 北京五八信息技术有限公司 一种交互方法、装置、计算机设备及计算机可读存储介质
CN108804243B (zh) * 2018-05-23 2022-11-25 北京五八信息技术有限公司 一种交互方法、装置、计算机设备及计算机可读存储介质
CN109840093A (zh) * 2018-12-24 2019-06-04 苏州蜗牛数字科技股份有限公司 一种任意函数适配器实现方法
CN115080006A (zh) * 2021-03-15 2022-09-20 武汉斗鱼网络科技有限公司 一种数据调用方法及相关设备
CN113407190A (zh) * 2021-06-16 2021-09-17 武汉光庭信息技术股份有限公司 Android系统与汽车ECU模块通信数据序列化和反序列化方法及系统

Also Published As

Publication number Publication date
CN107832056B (zh) 2020-12-18

Similar Documents

Publication Publication Date Title
CN107832056A (zh) 基于jni的c++中java函数调用方法
CN109076028A (zh) 异构软件定义网络环境中的微分段
CN101840334B (zh) 一种软件构件服务化封装方法
Agrawal et al. Graph transformations on domain-specific models
US8201140B2 (en) System and method for creating and using graphical object instances in a statechart environment
US9274761B1 (en) Dual programming interface
CN106415495A (zh) 用于应用开发的编程系统和语言
CN106502668B (zh) 一种实现Android JNI反射的接口封装方法及系统
CN102609255A (zh) 一种Spring IOC配置文件的生成方法
CN102866890B (zh) 基于对象关联的Android嵌入式界面及程序框架的生成系统及生成方法
CN113597751A (zh) 用于模型映射和在网络设备上动态使能外部模型的方法和装置
Schrijvers et al. Monads, zippers and views: virtualizing the monad stack
CN102957697A (zh) 一种多域间基于rbac模型的访问控制策略合成方法
CN109445845A (zh) 接口调用方法、装置、计算机设备和存储介质
CN107330014A (zh) 一种数据表的创建方法与设备
CN106293770A (zh) 一种表数据的通用导表系统和方法
CN107479866A (zh) 基于重构技术实现开放终端应用数据与功能的方法
Sukhov et al. Horizontal transformations of visual models in MetaLanguage system
US20070038666A1 (en) Independent explicit interface implementation
Gao et al. Applying Aspect-Orientation in Designing Security Systems: A Case Study.
CN111176658B (zh) 基于元对象机制的AADL到Simulink模型自动转换方法
US8271938B2 (en) Flexible base class library
Märtin et al. Patterns and models for automated user interface construction–in search of the missing links
CN104111863B (zh) 管理不同虚拟化平台中虚拟机的方法与系统
CN109885396A (zh) 一种游戏应用中的字符串构建方法和装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant