欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java調(diào)用C++程序的實現(xiàn)方式

 更新時間:2022年02月15日 11:59:32   作者:hhxx99  
這篇文章主要介紹了Java調(diào)用C++程序的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java調(diào)用C++程序

這篇博文是自己在學(xué)習(xí)過程中,踩了很多坑之后,為了避免廣大熱愛編程的盆友再像我這樣浪費太多時間,索性將自己的實現(xiàn)方法總結(jié)出來,以供大家參考。程序最終實現(xiàn)的是Hello World效果,話不多說,直接進(jìn)入正題:

1、編寫Java程序:HelloWorld

代碼如下:

package HelloWorld;
public class HelloWorld {
   public native void sayHello();   
   public static void main(String[] args) {
   	System.loadLibrary("Win32Project1");
   	HelloWorld tNative = new HelloWorld();
   	tNative.sayHello();
   }
}

2、Windows環(huán)境下,在cmd中編譯以上程序

編譯通過后,使用 javah -jni HelloWorld.HelloWorld命令,在src文件夾下生成HelloWorld_HelloWorld.h文件(注意,此處我寫的兩個HelloWorld,前一個指包名,后一個指類名,由于我是寫在eclipse中的,所以需要寫明包名和類名,這樣在cmd中編譯、運行時才不會報錯)。

在執(zhí)行完這一步后,能夠看到HelloWorld.java、HelloWorld.class、HelloWorld_HelloWorld.h這三個文件是位于同一個src文件夾下的,如下圖所示(注意,此處的src文件夾是在eclipse中創(chuàng)建HelloWorld這個java project時自動生成的,并非手動創(chuàng)建的):

3、編寫C++程序

打開Visual Studio 2013,執(zhí)行“文件—>新建—>項目—>Visual C++—>Win32 項目—>確定—>下一步–>選擇DLL(D)–>完成”。

注意,設(shè)置好項目名稱以及項目文件所在的位置,如下圖標(biāo)紅處所示:

創(chuàng)建好項目之后,將之前生成的HelloWorld_HelloWorld.h頭文件添加到項目的“頭文件”中,并在源文件中添加helloworld.cpp這一文件,如下圖所示:

接下來,在helloworld.cpp文件中輸入以下代碼:

// helloworld.cpp : 定義DLL應(yīng)用程序的導(dǎo)出函數(shù)。
//
#include "stdafx.h"
#include "HelloWorld_HelloWorld.h"
#include<iostream>
using namespace std;
JNIEXPORT void JNICALL Java_HelloWorld_HelloWorld_sayHello(JNIEnv *, jobject)
{
	cout << "hello world" << endl;
}

右鍵該項目的項目名,選擇“生成”。注意,此時會報錯‘error C1083: 無法打開包括文件: “jni.h”: No such file or directory’,解決的辦法是:將你電腦上Java文件夾下,jdk目錄的include目錄下的jni.h文件(比如,D:\Java\jdk1.8.0_144\include)以及win32目錄下的jni_md.h文件(比如,D:\Java\jdk1.8.0_144\include\win32)都拷貝到Visual Studio\vc\include目錄下即可解決該問題。然后再次右鍵項目名稱,選擇“生成”。

4、完成以上步驟后

打開你Visual Studio的C++項目源文件所在的文件夾(也就是在創(chuàng)建C++項目時你所選擇的“位置”的目錄),將Debug目錄下的dll文件拷貝到Java文件夾下,jdk目錄的bin目錄中,如下圖所示:

5、重新編譯HelloWorld.java程序

運行,即可得到Hello World這個結(jié)果。

Java與C++的互調(diào)

C++調(diào)用Java

1)Unix環(huán)境下安裝jdk,并且設(shè)置jdk和jre的環(huán)境變量,如下:

JRE_HOME=/usr/java/jdk1.6.0_04/jre
CLASS_PATH=.:/usr/java/jdk1.6.0_04/lib/dt.jar:/usr/java/jdk1.6.0_04/lib/tools.jar
JAVA_HOME=/usr/java/jdk1.6.0_04
LD_LIBRARY_PATH=/usr/java/jdk1.6.0_04/jre/lib/amd64:/usr/java/jdk1.6.0_04/jre/lib/amd64/server
PATH=/usr/java/jdk1.6.0_04/bin

2)編寫java測試程序,代碼如下:

編譯,生成MyTest.jar,將jar放到unix環(huán)境測試目錄下。

3)編寫c++測試代碼

  

其中JNI_CreateJavaVM表示創(chuàng)建java虛擬機(jī)環(huán)境,

  • FindClass獲取需要調(diào)用的類,
  • GetMethodID獲取類中的方法;
  • CallStaticIntMethod獲取返回整型靜態(tài)方法;
  • CallBooleanMethod獲取返回布爾類型方法
  • DestroyJavaVM釋放虛擬機(jī)。
  • stoJstringjstringTostring函數(shù),是將jvm中類型與c++類型轉(zhuǎn)換。

調(diào)用類中的方法GetMethodID調(diào)用時,第三個參數(shù)“(II)I”表示方法的輸入輸出參數(shù)類型,

“()”里面的標(biāo)識輸入?yún)?shù)類型,括號外面的表示輸出參數(shù)類型。參數(shù)類型查看,可以根據(jù)編譯的.class文件,使用命令javap -s -p 類名查看,如下圖:

注意:一個進(jìn)程中只能啟動一個java虛擬機(jī)。

4)編譯與運行

編譯時設(shè)置相關(guān)的頭文件和庫文件路徑,編譯命令:g++ testjava.cpp -o testjava -I${JAVA_HOME}/include-I${JAVA_HOME}/include/linux -L${JRE_HOME}/lib/amd64/server –ljvm

運行結(jié)果如下:

Java調(diào)用C++

1)編寫java代碼,如下:

使用native標(biāo)識方法由c++實現(xiàn);

System.loadLibrary表示加載c++庫,示例中加載的庫文件為libMyTest.so

2)將java文件編譯成.class文件,使用javah命令,根據(jù)class文件生成c++的接口頭文件

此時生成MyTest.h文件,內(nèi)容如下:

3)編寫接口函數(shù)的實現(xiàn),如下:

4)編譯c++文件,生成庫文件

這時生成了libMyTest.so庫文件。

配置庫文件到環(huán)境變量中

exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/export/home/process/PM/testjava

5)將java程序的jar文件放到同一個目錄下,運行jar,運行結(jié)果如下,此時調(diào)用的sub函數(shù),是C++程序?qū)崿F(xiàn)的。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解java設(shè)計模式中的門面模式

    詳解java設(shè)計模式中的門面模式

    門面模式又叫外觀模式(Facade?Pattern),主要用于隱藏系統(tǒng)的復(fù)雜性,并向客戶端提供了一個客戶端可以訪問系統(tǒng)的接口,本文通過實例代碼給大家介紹下java門面模式的相關(guān)知識,感興趣的朋友一起看看吧
    2022-02-02
  • 使用Jackson-json解析一個嵌套的json字符串

    使用Jackson-json解析一個嵌套的json字符串

    這篇文章主要介紹了使用Jackson-json解析一個嵌套的json字符串,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • mybatis解析xml配置中${xxx}占位符的代碼邏輯

    mybatis解析xml配置中${xxx}占位符的代碼邏輯

    本文主要介紹了mybatis解析xml配置中${xxx}占位符的代碼邏輯,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2023-05-05
  • java高并發(fā)下CopyOnWriteArrayList替代ArrayList

    java高并發(fā)下CopyOnWriteArrayList替代ArrayList

    這篇文章主要為大家介紹了java高并發(fā)下CopyOnWriteArrayList替代ArrayList的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java多線程編程綜合案例詳解

    Java多線程編程綜合案例詳解

    這篇文章將通過三個案例帶大家了解一下Java中的多線程編程,文中的示例代碼介紹詳細(xì),對我們的學(xué)習(xí)或工作有一定的價值,感興趣的小伙伴可以了解一下
    2022-07-07
  • Java?輸入輸出?IO?NIO?AIO三兄弟對比分析對比分析

    Java?輸入輸出?IO?NIO?AIO三兄弟對比分析對比分析

    這篇文章主要為大家介紹了Java?輸入輸出?IO?NIO?AIO三兄弟對比分析對比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • spring boot 如何優(yōu)雅關(guān)閉服務(wù)

    spring boot 如何優(yōu)雅關(guān)閉服務(wù)

    這篇文章主要介紹了spring boot 如何優(yōu)雅關(guān)閉服務(wù),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • druid?return行為方法源碼示例解析

    druid?return行為方法源碼示例解析

    這篇文章主要為大家介紹了druid?return行為源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • SpringCloud Gateway的基本入門和注意點詳解

    SpringCloud Gateway的基本入門和注意點詳解

    這篇文章主要介紹了SpringCloud Gateway的基本入門和注意點,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 在IntelliJ IDEA中為自己設(shè)計的類庫生成JavaDoc的方法示例

    在IntelliJ IDEA中為自己設(shè)計的類庫生成JavaDoc的方法示例

    這篇文章主要介紹了在IntelliJ IDEA中為自己設(shè)計的類庫生成JavaDoc的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論