1. 程式人生 > >JAVA和C/C++相互呼叫

JAVA和C/C++相互呼叫

JNIJAVAC/C++相互呼叫

1JAVA可以通過JNI呼叫C/C++函式

2C/C++也可以通過JNI相關函式,來呼叫JAVA。並且可以訪問到JAVA類中所有成員變數和成員函式。

要實現C/C++呼叫JAVA相關功能,則需要掌握以下知識點:

1C/C++如何找到JAVA

2C/C++如何獲取到JAVA變數

3C/C++如何設定Java變數

4C/C++如何獲取到JAVA函式

3、帶著這些疑問,我還是來寫個簡單程式。

該程式主要實現以下功能:

1java傳遞兩個數,讓C/C++做運算。

2C/C++將運算結果,讓JAVA顯示。

3java傳遞兩個字串,讓C/C++做連線操作

4C/C++將運算結果,讓JAVA

顯示。

5C/C++獲取JAVA的變數,並且修改JAVA變數值。

6Java計算並且顯示。

7C/C++獲取JAVAString物件,並且修改物件值。

8Java將修改後的值連線並且顯示。

4jnicalleachother.java程式碼如下:

publicclass jnicalleachother

{

float f1;

float f2;

Stringstr1;

Stringstr2;

StringstrResult;

static

{

System.loadLibrary("jnicalleachother");

}

publicnative int AddFloat(float fFirst, float fSecond);

publicnative int AddJavaFloat();

publicnative int CatString(String fFirst, String fSecond);

publicnative int CatJavaString();

publicint PrintFloat(float fFirst, float fSecond, float fResult)

{

System.out.println("fFirst:"+ fFirst);

System.out.println("fSecond:"+ fSecond);

System.out.println("Result:"+ fResult);

return0;

}

publicint PrintString(String strFirst, String strSecond, String strResult)

{

System.out.println(strFirst);

System.out.println(strSecond);

System.out.println(strResult);

return0;

}

publicint PrintModifyFloat()

{

floatfResult = (float)0.0;

System.out.println("fFirst:"+ f1);

System.out.println("fSecond:"+ f2);

fResult= f1 + f2;

System.out.println("Result:"+ fResult);

return0;

}

publicint PrintModifyString()

{

System.out.println(str1);

System.out.println(str2);

strResult= str1 + str2;

System.out.println(strResult);

return0;

}

publicstatic void main(String[] args)

{

jnicalleachotherdata = new jnicalleachother();

data.f1= (float)100.00;

data.f2= (float)1000.00;

data.AddFloat(data.f1,data.f2);

data.str1= "Java call";

data.str2= "c/c++";

data.CatString(data.str1,data.str2);

data.AddJavaFloat();

data.CatJavaString();

}

}

5、通過javah命令生成的標頭檔案(jnicalleachother.h)如下:

/*DO NOT EDIT THIS FILE - it is machine generated */

#include<jni.h>

/*Header for class jnicalleachother */

#ifndef_Included_jnicalleachother

#define_Included_jnicalleachother

#ifdef__cplusplus

extern"C" {

#endif

/*

*Class: jnicalleachother

*Method: AddFloat

*Signature: (FF)I

*/

JNIEXPORTjint JNICALL Java_jnicalleachother_AddFloat

(JNIEnv*, jobject, jfloat, jfloat);

/*

*Class: jnicalleachother

*Method: AddJavaFloat

*Signature: ()I

*/

JNIEXPORTjint JNICALL Java_jnicalleachother_AddJavaFloat

(JNIEnv*, jobject);

/*

*Class: jnicalleachother

*Method: CatString

*Signature: (Ljava/lang/String;Ljava/lang/String;)I

*/

JNIEXPORTjint JNICALL Java_jnicalleachother_CatString

(JNIEnv*, jobject, jstring, jstring);

/*

*Class: jnicalleachother

*Method: CatJavaString

*Signature: ()I

*/

JNIEXPORTjint JNICALL Java_jnicalleachother_CatJavaString

(JNIEnv*, jobject);

#ifdef__cplusplus

}

#endif

#endif

6、本地實現原始檔(jnicalleachother.c

#include"jnicalleachother.h"

/*

*Class: jnicalleachother

*Method: AddFloat

*Signature: (FF)I

*/

JNIEXPORTjint JNICALL Java_jnicalleachother_AddFloat(JNIEnv * pEnv, jobjectpObject, jfloat fFirst, jfloat fSecond)

{

jfloatfResult = 0.0;

jintiResult = 0;

fResult= fFirst + fSecond;

jclasscls = (* pEnv)->GetObjectClass(pEnv,pObject);

jmethodIDprintFloat = (* pEnv)->GetMethodID(pEnv,cls,"PrintFloat","(FFF)I");

iResult= (* pEnv)->CallIntMethod(pEnv, pObject,printFloat, fFirst,fSecond, fResult);

}

/*

*Class: jnicalleachother

*Method: AddJavaFloat

*Signature: ()I

*/

JNIEXPORTjint JNICALL Java_jnicalleachother_AddJavaFloat(JNIEnv * pEnv,jobject pObject)

{

jfloatfResult = 0.0;

intiResult = 0;

jclasscls= (* pEnv)->GetObjectClass(pEnv, pObject);

jfieldIDffield1 =(*pEnv)->GetFieldID(pEnv, cls,"f1","F");

(*pEnv)->SetFloatField(pEnv,pObject,ffield1,15848.00);

jfieldIDffield2 =(*pEnv)->GetFieldID(pEnv, cls,"f2","F");

(*pEnv)->SetFloatField(pEnv,pObject,ffield2,125454.00);

jmethodIDprintFloat = (* pEnv)->GetMethodID(pEnv,cls,"PrintModifyFloat","()I");

iResult= (* pEnv)->CallIntMethod(pEnv, pObject,printFloat);

}

/*

*Class: jnicalleachother

*Method: CatString

*Signature: (Ljava/lang/String;Ljava/lang/String;)I

*/

JNIEXPORTjint JNICALL Java_jnicalleachother_CatString(JNIEnv * pEnv, jobjectpObject, jstring strFirst, jstring strSecond)

{

charszResult[128] = {0};

char* pszFirst = NULL;

char* pszSecond = NULL;

intiResult = 0;

jstringstrResult = NULL;

pszFirst= (* pEnv)->GetStringUTFChars(pEnv, strFirst, NULL);

pszSecond= (* pEnv)->GetStringUTFChars(pEnv, strSecond, NULL);

strcpy(szResult,pszFirst);

strcat(szResult," ");

strcat(szResult,pszSecond);

jclasscls = (* pEnv)->GetObjectClass(pEnv,pObject);

jmethodIDprintString = (* pEnv)->GetMethodID(pEnv,cls,"PrintString","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I");

strResult= (* pEnv)->NewStringUTF(pEnv, szResult);

iResult= (* pEnv)->CallIntMethod(pEnv, pObject,printString, strFirst,strSecond, strResult);

(*pEnv)->ReleaseStringUTFChars(pEnv, strFirst, pszFirst);

(*pEnv)->ReleaseStringUTFChars(pEnv, strSecond, pszSecond);

}

/*

*Class: jnicalleachother

*Method: CatJavaString

*Signature: ()I

*/

JNIEXPORTjint JNICALL Java_jnicalleachother_CatJavaString(JNIEnv * pEnv,jobject pObject)

{

intiResult = 0;

jstringstrFirst= (*pEnv)->NewStringUTF(pEnv, "C/C++ call ");

jstringstrSecond= (*pEnv)->NewStringUTF(pEnv, "Java");

jclasscls= (* pEnv)->GetObjectClass(pEnv, pObject);

jfieldIDffield1 =(*pEnv)->GetFieldID(pEnv,cls,"str1","Ljava/lang/String;");

(*pEnv)->SetObjectField(pEnv,pObject,ffield1,strFirst);

jfieldIDffield2 =(*pEnv)->GetFieldID(pEnv,cls,"str2","Ljava/lang/String;");

(*pEnv)->SetObjectField(pEnv,pObject,ffield2,strSecond);

jmethodIDprintString = (* pEnv)->GetMethodID(pEnv,cls,"PrintModifyString","()I");

iResult= (* pEnv)->CallIntMethod(pEnv, pObject,printString);

}

7、執行結果:

[email protected]:~/work/jni/jnicalleachother$java jnicalleachother

fFirst:100.0

fSecond:1000.0

Result:1100.0

Javacall

c/c++

Javacall c/c++

fFirst:15848.0

fSecond:125454.0

Result:141302.0

C/C++call

Java

C/C++call Java

相關推薦

C++】inline函式 && CC++的相互呼叫

一、inline函式 (佔用太大空間) 在編譯時處理。呼叫點把程式碼直接展開 注意* 是以程式碼膨脹為代價 當函式堆疊的開銷>函式執行的開銷(建議使用inline函式) 一般寫在標頭檔案下 inline函式          

使用Thrift讓PythonC#可以相互呼叫

在聊如何使用Thrift讓Python和C#可以互相呼叫之前,我們先來看看下面的話題。 一、什麼是微服務、微服務的特徵、誕生的背景、優勢和不足   微服務:使用一套小服務來開發單個應用的方式,每個服務執行在 獨立的程序中,一般採用輕量級的通訊機制互聯,並且他們可以通過自動化的方式部署。   微服務的特徵

android-javaC++的相互呼叫-隨心

剛研究了java與C++的相互呼叫,趕緊記錄下來。。。一、java呼叫C++ 要想讓java呼叫C++,必須讓C++函式按著命名規則來。命名規則為 返回值 Java_包路徑_類名_函式名(JNIEnv* env,jobject obj);對應如下: jint Java_

6. c++c相互呼叫

c++ 編譯器能夠相容C語言的編譯方式 c++ 編譯器會優先使用c++編譯的方式 extern關鍵字會強制讓c++編譯器進行c方式的編譯 extern "C" { #include "c.h"

LLVM IRC/C++函式相互呼叫時的注意事項

已下敘述,主要針對LLVM 3.6。 一、從C/C++呼叫LLVM IR函式 主要有兩種辦法。 1、通過llvm::ExecutionEngine::runFunction()呼叫。     存在的問

SwiftObjective-C相互呼叫

(一)Swift呼叫Objective-C 1)已有的OC專案new file 建立swift 檔案 2)出現如下所示的彈框 配置oc橋接標頭檔案的提示 `LearnSwift-Bridging-Header` 3)點選Create Bri

Java.NET(C#)的開發用到的技術對比總結

平臺 分發 非關系型 宇宙 marker core block 微軟企業庫 session 前言 聲明:我指的是一般的Java和.NET(C#)的後臺開發用到的技術總結 最近一直在應聘ing,樓主的項目還是.NET(C#)項目居多,Java項目相對少,在這也吐槽下,招.

C# C++ dll 相互呼叫文章彙總

====cpp呼叫cpp DLL  三件套(顯式 隱式)       利用C++製作dll並呼叫dll 顯式呼叫 https://blog.csdn.net/hlx371240/article/details/51507025   ====c

C語言與C++語言相互呼叫

                                          &

Unity3D中js與C#之間相互呼叫的解決辦法

轉載自:http://www.manew.com/3102.html Unity3D中一些指令碼的方法只能用在JS中,在C#中是無效的,而C#可以與伺服器端通訊,JS本身卻不行。而且,如果需要用到js呼叫c#的問題,js會比c#先編譯,所以在mac裡編譯ios的時候會出錯,

go 與c相互呼叫

Golang與C的關係非常密切,下面主要介紹在Golang中使用C。 一. Golang中嵌入C程式碼   1 package main                                                                    

C/C++函式相互呼叫

注意這裡的C呼叫C++或者C++呼叫C意思是.c檔案中呼叫.cpp檔案中程式碼,或者相反。 整合開發環境如VC++6.0或者vs都是以檔案字尾來區別當前要編譯的是C程式碼還是C++程式碼,然後採用響應的編譯、呼叫協議等。 使用extern "C" 主要是因為C編譯器編譯函式時不帶引數的型別資訊,只包含函式的

asp.net js與後臺C#程式碼相互呼叫

(1)前臺js呼叫後臺C#程式碼 前臺js <script type="text/javascript" language="javascript">   function Ceshi(

Java系統PHP系統相互呼叫

一、HTTP JSON方式的缺點 JSON序列化效率低 多語言服務治理功能低 二、關於RPC框架 RPC 框架大致分為兩類,一種是偏重服務治理,另一種側重跨語言呼叫 2.1 服務治理型 特點 功能豐富,提供高效能的遠端呼叫、服務發現及服務治理能力,適用於大型服務的服務解耦及服務治理,對於特定語言(Java

python與C++的相互呼叫(2)

上文簡單介紹了python,以及在C中進行python模組的匯入、函式、類介面的獲得等比較基本的操作。接下來我們考慮:當我們已經獲得了函式的介面之後,我們就應該能夠對他進行呼叫了,接下來我們就來說一說函式的引數和返回值的問題。上文已經說了在python的世界裡一切都是以P

Java構造方法的相互呼叫

在java中,如果一個構造方法想呼叫另一個構造方法,需要是用this(引數列表)的形式,自動呼叫對應的構造方法。不可以直接使用類名進行呼叫。 public class Person { private String name; private int age

swiftoc的相互呼叫,其實很簡單(基於swift4.0)

swift呼叫oc: 需要在統一的bridge標頭檔案(xxx-Bridging-Header.h)裡面import,然後即可使用。 oc呼叫swift: 需要在暴露出來的方法和屬性上加@objc否則不可用;且檔案的類需要繼承自NSObject或NSObjec

關於OCJS的相互呼叫

本文主要講述OC呼叫JS的內部的方法,和用JS來呼叫OC的方法,由於程式碼中已經加了註釋,所以不再贅述。在這裡用本地 HTML 檔案作為說明,HTML檔案如下: <!doctype html> <html> <head> <

MFC中CHtmlViewJS的相互呼叫

沒廢話,直接上步驟: 1、建立一個繼承自CHtmlView的類; 2、建構函式中新增 CNewHtmlView::CNewHtmlView() { // 允許自動化 EnableAutomation(); } 3、過載 virtual HRESULT OnGetExte

NDK基礎(java ,c/c++, jni之間的關係及javac/c++之間的相互呼叫

1.java,c/c++,和jni之間的關係 java和c/c++可以相互呼叫,是因為java虛擬機器中的JNI。簡單的說就是用c/c++編寫一個動態連結庫讓Java虛擬機器去呼叫。(在windows環境下動態連結庫就是.dll檔案, 在Linux下就是.so檔案) 2.