【Java进阶】jdk17 JNI本地方法实践

embedded/2024/11/8 17:54:42/

环境:
Java: jdk17.0.11 maven3.8.1
Clang: gcc.exe (Rev1, Built by MSYS2 project) 14.2.0

Java代码样例:

java">package com.hmwl.godlike.demo.printf2;/*** @description:* @author: * @email: * @date: 2024/11/8 15:23*/
public class Printf2 {public static native String sprintf(String format, double x);static {System.loadLibrary("Printf2");}
}
java">package com.hmwl.godlike.demo.printf2;/*** @description:* @author:* @email: * @date: 2024/11/8 15:22*/
public class Printf2Test {public static void main(String[] args) {double prince = 44.95;double tax = 7.75;double amountDue = prince * (1 + tax / 100);String s = Printf2.sprintf("Amount due: %8.2f", amountDue);System.out.println(s);}
}

在Printf2.java所在目录执行:
javac -h . Printf2.java

得到含路径的.h头文件。参考如下:

/** Class:     com_hmwl_godlike_demo_printf2_Printf2* Method:    sprintf* Signature: (Ljava/lang/String;D)Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_com_hmwl_godlike_demo_printf2_Printf2_sprintf(JNIEnv *, jclass, jstring, jdouble);#ifdef __cplusplus
}
#endif
#endif

编写本地方法如下:

#include "com_hmwl_godlike_demo_printf2_Printf2.h"
#include <string.h>
#include <stdlib.h>
#include <float.h>char* find_format(const char format[])
{char* p;char* q;p = strchr(format, '%');while (p != NULL && *(p + 1) == '%') /* skip %% */p = strchr(p + 2, '%');if (p == NULL) return NULL;/* now check that % is unique */p++;q = strchr(p, '%');while (q != NULL && *(q + 1) == '%') /* skip %% */q = strchr(q + 2, '%');if (q != NULL) return NULL; /* % not unique */q = p + strspn(p, " -0+#"); /* skip past flags */q += strspn(q, "0123456789"); /* skip past field width */if (*q == '.') { q++; q += strspn(q, "0123456789"); }/* skip past precision */if (strchr("eEfFgG", *q) == NULL) return NULL;/* not a floating-point format */return p;
}JNIEXPORT jstring JNICALL Java_com_hmwl_godlike_demo_printf2_Printf2_sprintf(JNIEnv* env, jclass cl,jstring format, jdouble x)
{const char* cformat;char* fmt;jstring ret;cformat = (*env)->GetStringUTFChars(env, format, NULL);fmt = find_format(cformat);if (fmt == NULL)ret = format;else{char* cret;int width = atoi(fmt);if (width == 0) width = DBL_DIG + 10;cret = (char*) malloc(strlen(cformat) + width);sprintf(cret, cformat, x);ret = (*env)->NewStringUTF(env, cret);free(cret);}(*env)->ReleaseStringUTFChars(env, format, cformat);return ret;
}void main() {
}

使用 msys2 命令行,切换到c代码所在文件夹,执行:
gcc -shared -o Printf2.dll Printf2.c -I"C:\Program Files\Java\jdk-17.0.11\include" -I"C:\Program Files\Java\jdk-17.0.11\include\win32"

-I 这两个目录的目的是为了让gcc 能够链接到 jni.h

编译无误,可以执行 Printf2Test 得到最终结果:
在这里插入图片描述

注意点:

  1. c代码中所引用的.h 方法名称要与实际生成的一致。
  2. gcc的平台要和jdk一致,否则即使编译通过,执行也会报错如下。
    鸣谢文献: 《Java核心卷卷2 12th》作者: Cay Horstmann

http://www.ppmy.cn/embedded/135948.html

相关文章

现代Web开发:WebSocket 实时通信详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;WebSocket 实时通信详解 现代Web开发&#xff1a;WebSocket 实时通信详解 现代Web开发&#xff1a;WebS…

如何利用指纹浏览器爬虫绕过Cloudflare的防护?

网络爬虫能够系统地浏览网页并提取所需的数据&#xff0c;通常被用于市场研究、数据分析或者竞争情报。然而&#xff0c;一些反爬虫机制给网络爬虫的工作带来了不少挑战和风险。 其中&#xff0c;Cloudflare提供了多层次的防护机制&#xff0c;包括IP封锁、速率限制、CAPTCHA验…

DBA之路,始于足下

DBA之路&#xff0c;始于足下 与DBA的缘分工作一年的体会未来的规划 与DBA的缘分 我以前从来没有想过会成为一名DBA。从进入研究生开始&#xff0c;我就已经给自己规划好了找工作的学习路线-Java开发工程师。我从算法、项目、八股、面试等各个方面展开准备&#xff0c;所有的面…

RuleAlign 规则对齐框架:将医生的诊断规则形式化并注入模型,无需额外人工标注的自动对齐方法

RuleAlign 规则对齐框架&#xff1a;将医生的诊断规则形式化并注入模型&#xff0c;无需额外人工标注的自动对齐方法 提出背景论文大纲怎么用数据进行归纳推理&#xff1f;综合调研解法拆解全流程分析问题在于&#xff0c;我怎么构造这种规则数据&#xff1f;多轮问诊改进 论文…

Android CALL关于电话音频和紧急电话设置和获取

获取音频服务&#xff0c;设置音源类型&#xff1a;电话类型和获取最大电话音量&#xff0c;响铃模式 private AudioManager mAudioManager; mAudioManager (AudioManager) getSystemService(AUDIO_SERVICE); mAudioManager.setStreamVolume(AudioManager.STREAM_VOIC…

RHCE

第六章 DNS域名解析服务器 DNS简介 DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网。 DNS系统使用的是网络的查询&#xff0c;那么自然需要有监听…

NLP segment-20-分词开源项目介绍 HanLP 未来十年的自然语言处理

拓展阅读 分词系列专题 jieba-fenci 01 结巴分词原理讲解 segment jieba-fenci 02 结巴分词原理讲解之数据归一化 segment jieba-fenci 03 结巴分词与繁简体转换 segment jieba-fenci 04 结巴分词之词性标注实现思路 speechTagging segment jieba-fenci 05 结巴分词之简单…

43.第二阶段x86游戏实战2-提取游戏里面的lua

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…