visual studio2022 JNI極簡開發流程

文章目錄

  • 1 創建java類
  • 2 生成JNI頭文件
  • 3 使用visual studio2022創建DLL項目
    • 3.1 選擇模板中(Windows桌面向導)
    • 3.2 為項目命名
    • 3.3 選擇應用程序類型為動態鏈接庫
    • 3.4 項目概覽
  • 4 導入需要的頭文件
    • 4.1 導入需要的頭文件
    • 4.2 修改頭文件
  • 5 編寫C++實現
  • 6 生成dll文件
  • 7 在java中進行測試

1 創建java類

使用idea創建一個maven項目,名為jni-demo,并創建一個類JniTest

package com.example;public class JniTest {public native void printExt();}

整體結構如下:
在這里插入圖片描述

2 生成JNI頭文件

利用java類生成C頭文件,命令如下,注意要在包的根路徑執行,也就是src\main\java目錄下:

javah -classpath . -jni com.example.JniTest
  • 如果文件中有中文,需要指定格式,如格式為UTF-8 需要添加 -encoding UTF-8

  • 參數解析:
    -classpath [class]指定類的路徑
    -jni [類名] 需要生成的類名稱,注意不帶.java

執行后生成了如下頭文件com_example_JniTest.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_JniTest */#ifndef _Included_com_example_JniTest
#define _Included_com_example_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     com_example_JniTest* Method:    printExt* Signature: ()V*/
JNIEXPORT void JNICALL Java_com_example_JniTest_printExt(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif

3 使用visual studio2022創建DLL項目

3.1 選擇模板中(Windows桌面向導)

在這里插入圖片描述
如果沒有這個模板則安裝:
在這里插入圖片描述

3.2 為項目命名

在這里插入圖片描述

3.3 選擇應用程序類型為動態鏈接庫

在這里插入圖片描述

3.4 項目概覽

在這里插入圖片描述

4 導入需要的頭文件

4.1 導入需要的頭文件

將第二步生成的com_example_JniTest.h文件、JDK目錄的include目錄下有一個jni.h文件、和JDK目錄下的\include\win32下的jni_md.h文件復制到visual studio2022創建的項目中,如下:
在這里插入圖片描述
然后在visual studio2022中點擊頭文件->添加->現有項,找到上述三個頭文件,添加即可。

4.2 修改頭文件

找到jni.h文件中#include <jni_md.h>修改為#include "jni_md.h",如下:
在這里插入圖片描述
找到com_example_JniTest.h文件中#include <jni.h>修改為#include "jni.h"",如下:
在這里插入圖片描述

5 編寫C++實現

visual studio2022中點擊源文件->添加->新建項,選擇C++文件,命名為MyJinCpp.cpp,然后在MyJinCpp.cpp編寫如下內容:

#pragma execution_character_set("utf-8")//設置字符編碼,不然java中顯示亂碼
#include "com_example_JniTest.h"
#include <iostream>
using namespace std;//引入命名空間std,使得std::cout和std::endl可以直接省去std::JNIEXPORT void JNICALL Java_com_example_JniTest_printExt
(JNIEnv*, jobject) {cout << "現在你正在調用c++的實現" << endl;
}

6 生成dll文件

visual studio2022中右鍵點擊生成,輸出會顯示一個dll的地址,復制這個地址,接下來java要用:
在這里插入圖片描述

7 在java中進行測試

修改Main類,如下:

注意:

  • 使用System.load直接加載任意位置的動態鏈接庫,需要指定全路徑以及擴展名
  • 使用System.loadLibrary加載java.library.path這一jvm變量所指向的路徑中位置的動態鏈接庫,不需要指定全路徑以及擴展名可以通過System.getProperty("java.library.path")方法來獲得該變量的值
package com.example;// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {static {System.load("D:\\ItemProjects\\cpp\\JniProject\\x64\\Debug\\JniProject.dll");}public static void main(String[] args) {new JniTest().printExt();}
}

運行結果:

現在你正在調用c++的實現Process finished with exit code 0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11687.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

服務器3389端口,服務器3389端口風險提示的應對措施

3389端口是Windows操作系統中遠程桌面協議&#xff08;RDP&#xff09;的默認端口。一旦該端口被惡意攻擊者利用&#xff0c;可能會導致未經授權的遠程訪問和數據泄露等嚴重安全問題。 針對此風險&#xff0c;強烈建議您采取以下措施&#xff1a; 1. 修改默認端口&#xff1a;…

Java面試之抽象類和接口

Java的一個重要特性就是抽象&#xff0c;抽象是指將具體的事物抽象成更一般化、更抽象化的概念或模型。在Java中&#xff0c;抽象可以通過抽象類和接口來實現&#xff0c;它們讓你能夠定義一些方法但不提供具體實現&#xff0c;從而讓子類去實現具體細節。 一、抽象類&#xf…

springboot3 集成spring-authorization-server (一 基礎篇)

官方文檔 Spring Authorization Server 環境介紹 java&#xff1a;17 SpringBoot&#xff1a;3.2.0 SpringCloud&#xff1a;2023.0.0 引入maven配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

識別AI論文生成內容,降低論文高AI率

AI寫作工具能幫我們在短時間內高效生成一篇畢業論文、開通報告、文獻綜述、任務書、調研報告、期刊論文、課程論文等等&#xff0c;導致許多人開始使用AI寫作工具作為撰寫學術論文的輔助手段。而學術界為了杜絕此行為&#xff0c;開始使用AIGC檢測系統來判斷文章是由AI生成還是…

解鎖商業AI,賦能新質生產力發展——思愛普中國峰會探展全紀錄

ITValue 鈦媒體獨家探秘思愛普中國峰會&#xff0c;帶你深刻感受SAP助力企業利用以商業AI為代表的數字化技術&#xff0c;實現質的飛躍&#xff0c;通過全數據、全球化、全綠色賦能新型中國企業發展新質生產力。 首發&#xff5c;鈦媒體APP ITValue 5月10日&#xff0c;一年一度…

基于NTP服務器獲取網絡時間的實現

文章目錄 1 NTP1.1 簡介1.2 包結構1.3 UNIX 時間戳和NTP時間戳 2 代碼實現2.1 實現步驟2.2 完整代碼 3 結果 在某些場景下&#xff0c;單片機需要通過網絡獲取準確的時間進行數據同步&#xff0c;例如日志記錄、定時任務等。然而&#xff0c;單片機本身無法直接獲得準確的標準時…

Vue的學習 —— <vue指令>

目錄 前言 正文 內容渲染指令 內容渲染指令的使用方法 v-text v-html 屬性綁定指令 雙向數據綁定指令 事件綁定指令 條件渲染指令 循環列表渲染指令 偵聽器 前言 在完成Vue開發環境的搭建后&#xff0c;若想將Vue應用于實際項目&#xff0c;首要任務是學習Vue的基…

ORA-00932: inconsistent datatypes: expected - got CLOB的分析解決方案

最近在項目中遇到查詢數據時報ORA-00932: inconsistent datatypes: expected - got CLOB錯誤&#xff0c;這個錯誤很明顯是由于查詢時類型的不匹配造成的。 問題分析&#xff1a; 一、檢查你的查詢的實體的類型是否于數據庫的保持一致&#xff0c;如果不一致&#xff0c;那么需…

333_C++_編寫一個go函數每次從文件中讀取固定大小數據,且go作為回調,傳遞給其他函數中,多次調用,完成逐塊傳輸數據

(core工程文件) tick_transfer_all_t類是一個用于異步傳輸數據的輔助類,它在某個異步操作完成后將_tick的值設置為0,并返回傳輸的結果 namespace hl {namespace http{namespace __detail{class tick_transfer_all_t{boost::shared_ptr<unsigned long long> _tick

MySQL 查詢庫 和 表 占用空間大小的 語句

查看mysql 數據庫的大小 SELECT table_schema AS 數據庫名稱, ROUND(SUM(data_length index_length) / 1024 / 1024, 2) AS 數據庫大小(MB) FROM information_schema.tables GROUP BY table_schema;查詢數據庫中表的 數據量&#xff08;這個方法 有緩存延遲&#xff0c;只能用…

[力扣題解] 96. 不同的二叉搜索樹

題目&#xff1a;96. 不同的二叉搜索樹 思路 動態規劃 f[i]&#xff1a;有i個結點有多少種二叉搜索樹 狀態轉移方程&#xff1a; 以n3為例&#xff1a; 以1為頭節點&#xff0c;左子樹有0個結點&#xff0c;右子樹有2個結點&#xff1b; 以2為頭節點&#xff0c;左子樹有1個…

安科瑞AIM-D100-ES光伏儲能系統直流絕緣監測儀

概述 AIM-D100-ES 型直流絕緣監測儀主要用于在線監測直流不接地系統正負極對地絕緣電阻&#xff0c;當絕緣電阻低于設定值時&#xff0c;能發出預警和報警信號。 產品可測 100-1500V 的直流系統&#xff0c;可應用于儲能直流系統、電動汽車充電裝置、UPS 供電系統、光伏直流系…

超級好用的C++實用庫之日志類

&#x1f4a1; 需要該C實用庫源碼的大佬們&#xff0c;可搜索微信公眾號“希望睿智”。添加關注后&#xff0c;輸入消息“超級好用的C實用庫”&#xff0c;即可獲得源碼的下載鏈接。 概述 日志類主要用于在程序運行過程中記錄信息、錯誤、警告以及其他需要跟蹤的數據&#xff0…

std::ref和std::cref的使用和原理分析

目錄 1.用法 2.std::reference_wrapper介紹 3.std::ref原理分析 4.std::cref原理分析 5.總結 1.用法 它的定義如下&#xff1a; std::ref&#xff1a;用于包裝按引用傳遞的值。 std::cref&#xff1a;用戶包裝按const引用傳遞的值。 C本身就有引用&#xff08;&&#…

學習中的小疑問|頭結點是什么?

頭結點 在數據結構中&#xff0c;單鏈表是一種常見的線性數據結構&#xff0c;它由一系列節點組成&#xff0c;每個節點包含兩個部分&#xff1a;存儲數據的數據域和指向下一個節點的指針域。單鏈表的頭結點是指鏈表的第一個節點&#xff0c;它通常用于標識鏈表的開始位置。 …

面試題:調整數字順序,使奇數位于偶數前面

題目&#xff1a; 輸入一個整數數組&#xff0c;實現一個函數&#xff0c;來調整該數組中數字的順序 使得所有奇數位于數組的前半部分&#xff0c;所有偶數位于數組的后半部分 算法1&#xff1a; 利用快速排序的一次劃分思想&#xff0c;從2端往中間遍歷 時間復雜度&#x…

C++ | Leetcode C++題解之第88題合并兩個有序數組

題目&#xff1a; 題解&#xff1a; class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1 m - 1, p2 n - 1;int tail m n - 1;int cur;while (p1 > 0 || p2 > 0) {if (p1 -1) {cur nums2[p2-…

Alist + RaiDrive-Nas掛載云盤(Quark)

Alist RaiDrive-Nas掛載云盤(Quark) Alist download Alist document RaiDriver download — https://www.raidrive.com/ nssm download nssm document nssm specification 配置 Alist 下載適合的Alist版本后&#xff0c;啟動服務&#xff1b; 需使用命令符。 在完成解…

數字水印 | Python 基于離散小波變換 DWT 的圖像水印嵌入(上)

&#x1f34d;原文&#xff1a; 基于 dwt (離散小波變換) 實現彩色圖像水印嵌入部分_1.0 &#x1f34d;寫在前面&#xff1a; 本文在原文的基礎上進行了代碼補全。 正文 本文的內容主要為&#xff1a;水印圖像經過 A r n o l d \mathsf{Arnold} Arnold 置亂算法后&#xff0…