当前位置: 首页 > news >正文

太原网站设计制作网站开发网站说明怎么写

太原网站设计制作,网站开发网站说明怎么写,德国网站建设,wordpress 音乐主题模板介绍使用 JNI 调用 C 编写的动态链接库的全过程。 示例环境 项目说明JDK8C 编译器Visual Studio 2019Java 开发工具IntelliJ IDEA 2021.3操作系统Windows 10 Java 项目结构概览 编写 Java 类 在 org.jni.nativejni 包下创建类 HelloWorldJni.java: package org…

介绍使用 JNI 调用 C++ 编写的动态链接库的全过程。

示例环境

项目说明
JDK8
C++ 编译器Visual Studio 2019
Java 开发工具IntelliJ IDEA 2021.3
操作系统Windows 10

Java 项目结构概览

编写 Java 类

org.jni.nativejni 包下创建类 HelloWorldJni.java

package org.jni.nativejni;public class HelloWorldJni {static {// 加载 C++ 编译生成的 DLLSystem.load("E:/vsproject/HelloWorld/x64/Release/HelloWorld.dll");}// native 方法声明public native String sayHello(String str1, String str2);public native int add(int a, int b);public static void main(String[] args) {HelloWorldJni hw = new HelloWorldJni();System.out.println("拼接字符串:" + hw.sayHello("Hello", "World"));System.out.println("相加:" + hw.add(52, 23));}
}

生成 JNI 头文件

方法一:使用 javac -h(推荐方式,支持 JDK8+)

在项目根目录下执行命令:

javac -h src/main/jni src/main/java/org/jni/nativejni/HelloWorldJni.java

说明:

  • -h 参数用于指定生成头文件的目录。
  • 这个命令会编译 .java 文件然后生成 .class 文件,同时生成 JNI 头文件。

注意:这个命令会在源码目录中生成 .class 文件,建议在 target/classes 中操作,避免污染源码。

方法二:使用 javah(仅适用于 JDK8)

先使用 Maven 编译项目:

mvn clean install

然后执行:

javah -classpath target/classes -d src/main/jni org.jni.nativejni.HelloWorldJni

说明:

  • -classpath 指定 .class 文件的根路径。
  • -d 指定 JNI 头文件的输出目录。

实现 JNI 层与调用 DLL 方法

使用 Visual Studio 编译生成 DLL

  1. 创建一个新的 C++ DLL 项目,项目名称为 HelloWorld
  2. 添加源文件:
    • HelloWorld.cpp:实现 DLL 的原始功能逻辑。
    • HelloWorldJNI.cpp:实现 JNI 桥接代码。
  3. 配置项目属性:
    • C/C++ → 常规 → 附加包含目录中添加:
      • JDK 的 include 目录
      • JDK 的 include/win32 目录

C++ 头文件:HelloWorld.h

#ifndef HELLO_WORLD_H
#define HELLO_WORLD_H// 导出 HelloWorld 函数
extern "C" __declspec(dllexport) const char* HelloWorld(const char* str1, const char* str2);// 导出 Add 函数
extern "C" __declspec(dllexport) int Add(int a, int b);#endif // HELLO_WORLD_H#pragma once

C++ 实现:HelloWorld.cpp

// HelloWorld.cpp
#include "pch.h" // 如果 VS 生成了预编译头文件
#include "HelloWorld.h" // 引入头文件
#include <iostream>
#include <string>extern "C" __declspec(dllexport) const char* HelloWorld(const char* str1, const char* str2) {static std::string result; // 使用静态变量存储返回值,确保返回的指针有效result = std::string(str1) + "," + std::string(str2);return result.c_str(); // 返回拼接后的 C 字符串
}// 一个简单的加法函数
extern "C" __declspec(dllexport) int Add(int a, int b) {return a + b;
}

JNI 头文件:org_jni_nativejni_HelloWorldJni.h

javac -hjavah 自动生成,内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_jni_nativejni_HelloWorldJni */#ifndef _Included_org_jni_nativejni_HelloWorldJni
#define _Included_org_jni_nativejni_HelloWorldJni
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     org_jni_nativejni_HelloWorldJni* Method:    sayHello* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_org_jni_nativejni_HelloWorldJni_sayHello(JNIEnv *, jobject, jstring, jstring);/** Class:     org_jni_nativejni_HelloWorldJni* Method:    add* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_org_jni_nativejni_HelloWorldJni_add(JNIEnv *, jobject, jint, jint);#ifdef __cplusplus
}
#endif
#endif

JNI 实现:HelloWorldJNI.cpp

#include "pch.h" // 如果 VS 生成了预编译头文件
#include "org_jni_nativejni_HelloWorldJni.h"  // 引入自动生成的 JNI 头文件
#include "HelloWorld.h"    // 引入自定义的头文件,调用已有的 DLL 接口JNIEXPORT jstring JNICALL Java_org_jni_nativejni_HelloWorldJni_sayHello
(JNIEnv* env, jobject, jstring jStr1, jstring jStr2) {// 将 Java 字符串转换为 C 字符串const char* str1 = env->GetStringUTFChars(jStr1, nullptr);const char* str2 = env->GetStringUTFChars(jStr2, nullptr);// 调用 C++ 动态库函数const char* result = HelloWorld(str1, str2);// 释放 Java 字符串的本地内存env->ReleaseStringUTFChars(jStr1, str1);env->ReleaseStringUTFChars(jStr2, str2);// 将 C 字符串转换为 Java 字符串并返回return env->NewStringUTF(result);
}JNIEXPORT jint JNICALL Java_org_jni_nativejni_HelloWorldJni_add
(JNIEnv*, jobject, jint a, jint b) {return Add(a, b); // 调用原始的 Add 函数
}

提示:这里为了演示方便,JNI 桥接代码和业务逻辑放在同一个项目中。实际开发时桥接层要单独封装,便于维护与复用。

Java 调用 DLL 测试

将编译生成的 HelloWorld.dll 放到系统环境变量中,这里这个库没什么其他依赖,都是系统 c 盘中有的,所以直接指到它生成的目录就可以使用了。

运行 Java 主类的输出结果:

拼接字符串:Hello,World
相加:75

总结

梳理一下 Java 调用 C++ DLL 的完整流程。主要包括:

  1. 编写 Java 类并声明 native 方法
  2. 使用 javac -hjavah 生成 JNI 头文件
  3. 实现 JNI 桥接层,调用 DLL 中的 C++ 方法
  4. 使用 Visual Studio 生成 DLL 文件
  5. Java 运行时加载并调用本地方法,或者封装成接口给别人使用。
http://www.dtcms.com/a/565606.html

相关文章:

  • 告别乱码:OpenCV 中文路径(Unicode)读写的解决方案
  • 41_AI智能体核心业务之意图识别Agent:智能对话系统的决策大脑
  • 大数据毕业设计项目推荐 基于大数据的广西药店数据可视化分析系统 1.65w条数据【大数据毕业设计项目选题】
  • 猎豹算法详细原理,公式,应用案例—基于猎豹算法的函数优化
  • 实时通讯的稳定性秘诀:cpolar优化Websocket连接
  • 《基层建设》在哪个网站收录的哪些网站做的比较好
  • 用shopify 做网站厦门外贸网站建设多少钱
  • 智能建站公司网站建设所需美工
  • 网站后台管理系统功能海口网站开发建设
  • C语言基础之结构体
  • 西安做网站的公司地址王烨捷
  • 数据风险评估与安全风险评估的核心解析
  • Milvus:标量字段-字符串、数字、数组与结构数组(七)
  • 怎样做英文网站wordpress修改中文
  • 计算机网络学习笔记 | 传输层核心知识点总结(DAY03,匠心制作)
  • 做团购的的网站有哪些ug.wordpress.org
  • 从 CAD 图纸到 Excel 数据:橙色云智橙 PLM 打造制造企业数字化协同新模式
  • 【openGauss】构建一个兼容Oracle模式支持创建package的openGauss的docker镜像
  • 广州地区网站建设做的好的农产品网站
  • 城市本地生活实体零售可信数据空间 RWA 平台方案
  • 接管所有System.out.println转成Logger输出日志
  • 建三江廉政建设网站长春网站制作推广
  • [LitCTF 2023]这是什么?SQL !注一下 !
  • 小数位进制转换怎么用 python 表示
  • 网站页面报价镇海区建设工程安监站网站
  • ESP32 HTTP回调机制详解与优化实践
  • Pycharm+Deepseek结合使用Continue插件无法返回中文产生乱码
  • k8s基础概念、Pod、k8s基础命令
  • 设计模式——适配器(adapter)
  • Js随堂笔记2025-11-3