JAVA和C/C++相互呼叫
JNIJAVA和C/C++相互呼叫
1、JAVA可以通過JNI呼叫C/C++函式
2、C/C++也可以通過JNI相關函式,來呼叫JAVA。並且可以訪問到JAVA類中所有成員變數和成員函式。
要實現C/C++呼叫JAVA相關功能,則需要掌握以下知識點:
1、C/C++如何找到JAVA類
2、C/C++如何獲取到JAVA變數
3、C/C++如何設定Java變數
4、C/C++如何獲取到JAVA函式
3、帶著這些疑問,我還是來寫個簡單程式。
該程式主要實現以下功能:
1、java傳遞兩個數,讓C/C++做運算。
2、C/C++將運算結果,讓JAVA顯示。
3、java傳遞兩個字串,讓C/C++做連線操作
4、C/C++將運算結果,讓JAVA
5、C/C++獲取JAVA的變數,並且修改JAVA變數值。
6、Java計算並且顯示。
7、C/C++獲取JAVAString物件,並且修改物件值。
8、Java將修改後的值連線並且顯示。
4、jnicalleachother.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函式 && C和C++的相互呼叫
一、inline函式 (佔用太大空間) 在編譯時處理。呼叫點把程式碼直接展開 注意* 是以程式碼膨脹為代價 當函式堆疊的開銷>函式執行的開銷(建議使用inline函式) 一般寫在標頭檔案下 inline函式  
使用Thrift讓Python和C#可以相互呼叫
在聊如何使用Thrift讓Python和C#可以互相呼叫之前,我們先來看看下面的話題。 一、什麼是微服務、微服務的特徵、誕生的背景、優勢和不足 微服務:使用一套小服務來開發單個應用的方式,每個服務執行在 獨立的程序中,一般採用輕量級的通訊機制互聯,並且他們可以通過自動化的方式部署。 微服務的特徵
android-java與C++的相互呼叫-隨心
剛研究了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 IR和C/C++函式相互呼叫時的注意事項
已下敘述,主要針對LLVM 3.6。 一、從C/C++呼叫LLVM IR函式 主要有兩種辦法。 1、通過llvm::ExecutionEngine::runFunction()呼叫。 存在的問
Swift和Objective-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
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
swift和oc的相互呼叫,其實很簡單(基於swift4.0)
swift呼叫oc: 需要在統一的bridge標頭檔案(xxx-Bridging-Header.h)裡面import,然後即可使用。 oc呼叫swift: 需要在暴露出來的方法和屬性上加@objc否則不可用;且檔案的類需要繼承自NSObject或NSObjec
關於OC和JS的相互呼叫
本文主要講述OC呼叫JS的內部的方法,和用JS來呼叫OC的方法,由於程式碼中已經加了註釋,所以不再贅述。在這裡用本地 HTML 檔案作為說明,HTML檔案如下: <!doctype html> <html> <head> <
MFC中CHtmlView和JS的相互呼叫
沒廢話,直接上步驟: 1、建立一個繼承自CHtmlView的類; 2、建構函式中新增 CNewHtmlView::CNewHtmlView() { // 允許自動化 EnableAutomation(); } 3、過載 virtual HRESULT OnGetExte
NDK基礎(java ,c/c++, jni之間的關係及java和c/c++之間的相互呼叫)
1.java,c/c++,和jni之間的關係 java和c/c++可以相互呼叫,是因為java虛擬機器中的JNI。簡單的說就是用c/c++編寫一個動態連結庫讓Java虛擬機器去呼叫。(在windows環境下動態連結庫就是.dll檔案, 在Linux下就是.so檔案) 2.