[java][c++]Java调用c++详解

举报
lessIsBetter 发表于 2021/01/04 10:14:17 2021/01/04
【摘要】 Java调用c++步骤  (1)在Java包中创建native函数。 (2)生成native函数对应的c++头文件。头文件中将包含一个JNI函数声明。 (3)在c++项目中包含此头文件,并将这个JNI函数声明实现的函数,编译生成动态链接库。 (4)在上述Java包使用时,载入动态链接库。 (5)使用时,调用native函数,就是调用c++中的JNI函数。

Java在搭建服务上,有很多成熟的框架,比如Javaspring boot框架。

最近的项目是用c++实现的,但是服务依然采用Java实现。

 那么,Java如何调用c++呢?

Java调用c++步骤

 (1)在Java包中创建native函数。

(2)生成native函数对应的c++头文件。头文件中将包含一个JNI函数声明。

(3)在c++项目中包含此头文件,并将这个JNI函数声明实现的函数,编译生成动态链接库。

(4)在上述Java包使用时,载入动态链接库。

(5)使用时,调用native函数,就是调用c++中的JNI函数。

逐步详解

(1)在Java包中创建native函数

 public class JavaCallCppSimple {
    public native String cppServerSimple(String requestStr, String param);
}

 在类JavaCallCppSimple中,创建公开的native函数。

其函数包含两个入参,String request,String param,一个返回值 String。

(2)生成native函数对应的c++头文件。头文件中将包含一个JNI函数声明。

 比如这个包的名称是,com.company.cpp.tools。上述文件所在的路径是

$ProjectPath\bin\com\company\cpp\tools

那么我们切换目录到

$ProjectPath\bin

运行如下命令

javah -classpath . com.company.cpp.tools.JavaCallCppSimple

生成头文件

com_company_cpp_tools_JavaCallCppSimple.h

头文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include<jni.h>
/* Header for class com_company_cpp_tools_JavaCallCppSimple */
#ifndef _Included_com_company_cpp_tools_JavaCallCppSimple
#define _Included_com_company_cpp_tools_JavaCallCppSimple
#ifdef __cplusplus
extern"C"{
#endif
/*
 * Class:com_company_cpp_tools_JavaCallCppSimple
 * Method:cppServerSimple
 * Signature:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 */
    JNIEXPORT jstring JNICALL Java_com_company_cpp_tools_JavaCallCppSimple_cppServerSimple (JNIEnv *, jobject, jstring, jstring);
#ifdef __cplusplus
}
#endif
#endif

(3)在c++项目中包含此头文件,并将这个JNI函数声明实现的函数,编译生成动态链接库。

比如在cmakelist中,加入如下内容

add_library(LabName SHARED com_company_cpp_tools_JavaCallCppSimple.cpp)

 (4)在上述Java包使用时,载入动态链接库。

System.load(libPath);

 (5)使用时,调用native函数,就是调用c++中的JNI函数。

JavaCallCppSimple javaCallCppSimple = new JavaCallCppSimple();
String res = javaCallCppSimple.cppServerSimple(data, param);

参考:

https://www.cnblogs.com/charley_yang/archive/2011/03/13/1983038.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。