CN107832056A - 基于jni的c++中java函数调用方法 - Google Patents
基于jni的c++中java函数调用方法 Download PDFInfo
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation 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(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++类型);根据参数的个数和类型推导出参数签名,根据返回值类型推导出返回值签名;然后通过参数签名和返回值签名组成了函数签名。
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)
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)
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反射的接口封装方法及系统 |
-
2017
- 2017-12-14 CN CN201711336832.0A patent/CN107832056B/zh active Active
Patent Citations (4)
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)
Title |
---|
罗夏朴等: "java与c/c++互操作的研究", 《微型机与应用》 * |
Cited By (5)
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 |