1. 程式人生 > >【JNI開發】C++呼叫java函式的實現方法

【JNI開發】C++呼叫java函式的實現方法

本文的主要內容:C++中呼叫java類的成員函式和靜態成員函式

1,java程式碼

public class SNaviEngineManager {

    public void sendMessage(int msg)
    {

    }

    public static int sendMessage(int msg)
    {

    }	

}

2,c++程式碼

呼叫成員函式

void ms_sendmessage(int msg)
{
	
	// 獲取JNI環境
	bool attach = false;
	int status=0;
	JNIEnv* pEnv = NULL;
	status = g_jvm->GetEnv((void **) &pEnv, JNI_VERSION_1_6);  
	if( status < 0 )
	{
		LOGI("AttachCurrentThread");
		g_jvm->AttachCurrentThread(&pEnv, NULL);
		attach = true;
	}

	jmethodID mid = pEnv->GetMethodID( g_jcNaviEngine, "<init>", "()V");  
        jobject obj = pEnv->NewObject( g_jcNaviEngine, mid);
	if (obj == 0)  
	{  
		LOGE("Create object failed!");  
         }  

	// 呼叫成員方法  
        mid = pEnv->GetMethodID( g_jcNaviEngine, "sendMessage", "(I)V");
	if (mid != 0)  
	{  
		pEnv->CallVoidMethod( obj, mid, msg );	
	} 

	
	// 釋放JNI環境
	if( attach )
	{
		g_jvm->DetachCurrentThread();
	}
}

呼叫靜態成員函式
void ms_sendmessage(int msg)
{
	
	// 獲取JNI環境
	bool attach = false;
	int status=0;
	JNIEnv* pEnv = NULL;
	status = g_jvm->GetEnv((void **) &pEnv, JNI_VERSION_1_6);  
	if( status < 0 )
	{
		LOGI("AttachCurrentThread");
		g_jvm->AttachCurrentThread(&pEnv, NULL);
		attach = true;
	}
 

	// 呼叫靜態成員方法  
        jmethodID mid = pEnv->GetStaticMethodID( static_cast<jclass>(g_joNaviEngine), "sendMessage", "(I)V");
	if (mid != 0)  
	{  
		pEnv->CallStaticVoidMethod( obj, mid, msg );	
	} 

	
	// 釋放JNI環境
	if( attach )
	{
		g_jvm->DetachCurrentThread();
	}
}

【注意】

在呼叫java類的成員函式時,一定要呼叫建構函式例項化java類

/** 例項化類物件 */
jobject getInstance( JNIEnv* pEnv , jclass classzz )
{
	if ( pEnv == NULL )
	{
		return NULL ;
	}

	// 獲取構造方法
	jmethodID constructor = pEnv->GetMethodID(classzz, "<init>", "()V"); 
	if (NULL == constructor) 
	{ 
		return NULL;
	}   
	// 例項化類物件  
	return pEnv->NewObject(classzz, constructor); 
}


相關推薦

JNI開發C++呼叫java函式實現方法

本文的主要內容:C++中呼叫java類的成員函式和靜態成員函式 1,java程式碼 public class SNaviEngineManager { public void sendMe

android jni開發c++ 呼叫java 方法

    最近幾天搞fbreader 電子書的二次開發,其中需要 c++ 呼叫 java方法解密電子書,所以l老虎吃天,硬著頭皮看c++程式碼。  具體的思路如下,其實也就這幾步:      1. jni 中用到 java反射的方法

JNI開發-C/C++呼叫Java函式傳遞多個引數

       C/C++呼叫Java函式傳遞多個引數並返回String型別; Java的CCallJavaTools類: package com.niubashaoye.ndk.jni; public class CCallJavaTools { /** * C

C/C++開發C++ 解構函式以及 delete 和delete[]的整理

轉自:http://hi.baidu.com/bystander1983/item/bf0b5c12b077cfec9913d651 delete和delete[] 的區別: C++告訴我們在回收用 new 分配的單個物件的記憶體空間的時候用 delete,回收用 new[] 分配的一組物

安全開發C/C++安全編碼規範

C本質上是不安全的程式語言。例如如果不謹慎使用的話,其大多數標準的字串庫函式有可能被用來進行緩衝區攻擊或者格式字串攻擊。但是,由於其靈活性、快速和相對容易掌握,它是一個廣泛使用的程式語言。下面是針對開發安全的C語言程式的一些規範。 1.1.1      緩衝

JNI進階一 (C++呼叫java屬性和方法,javap的使用)

一、C/C++函式分析://獲取jclass物件,引數:this的意思,就是native方法所在的類1.GetObjectClass(jobject) //獲取普通屬性id,第一個引數:類物件, 第二個引數:屬性名,第三個引數:屬性簽名(不知道的同學點選這裡)2.GetFie

Python開發C和Python之間的介面實現

## 更新:關於ctypes,見拙作 聊聊Python ctypes 模組 - 蛇之魅惑 - 知乎專欄 屬於混合程式設計的問題。較全面的介紹一下,不僅限於題主提出的問題。 以下討論中,Python指它的標準實現,即CPython(雖然不是很嚴格) 本文分4個部分C/C++ 呼叫 Python (基礎篇)—

Linuxshell呼叫Java程式main方法通過crontab定時執行

最近一個專案需要寫一個batch定時讀取檔案往資料庫裡插入記錄,第一次寫,遇到好多問題,記錄一下。 先從shell如何呼叫java說起 建立如下目錄結構 batch                          根目錄 ├── bin                

VS開發C++ opencv Mat基礎

1.Mat基礎 在計算機記憶體中,數字影象是已矩陣的形式儲存的。OpenCV2中,資料結構Mat是儲存影象畫素資訊的矩陣,它主要包含兩部分:矩陣頭和一個指向畫素資料的矩陣指標。 矩陣頭主要包含,矩陣尺寸、儲存方法、儲存地址和引用次數等。 矩陣頭的大小是一個常數,不會隨著影象的大小而改變,但是儲存影象畫素資料

androidStudio JNI開發c調java的流程和注意事項

接著上一次的java調c,這次我們來看看c調java的具體步驟 接著上篇文章一直到在java檔案中新增native程式碼步驟 加入如下native方法 public native void call

VS開發C++執行緒安全

我們是多麼渴望各種C++類都是多執行緒安全的,然而一旦涉及到物件間的互動,這樣的渴望可能就只能是奢望了。下面,我們以設計一個雙向鏈結點為例,看看要使其多執行緒安全將會帶來一些什麼問題。 class DoublyLinedNode{        DoublyLinedNod

C/C++開發C++佇列快取的實現

C++佇列快取的實現 為什麼使用佇列快取 c++的佇列快取主要用於解決大資料量併發時的資料儲存問題,可以將併發時的資料快取到佇列中,當資料量變小時再勻速寫入硬碟中。 引用queue佇列 在標頭檔案中引用queue佇列 #include <queue>

嵌入式開發自定義AT指令實現sniffer網路嗅探功能

基礎 該功能是在NON-OS SDK下實現的。 Non-OS SDK 是不不基於作業系統的 SDK,提供 IOT_Demo 和 AT 的編譯。Non-OS SDK 主要使⽤用定時器和回撥函式的方式實現各個功能事件的巢狀,達到特定條件下觸發特定功能函式的目

Android開發圖形影象處理技術-實現Android動畫的兩種方式

在應用Android進行專案開發時,特別是在進行遊戲開發時,經常需要涉及動畫。Android中的動畫通常可以分為逐幀動畫(Frame Animation)和補間動畫(Tween Animation)兩種。下面將分別介紹這兩種動畫。 一.實現逐幀動畫(Frame Animat

iOS開發深入MVC---UITableView的資料來源方法封裝

一、在iOS開發中,MVC模式是再經典不過的了,本文將從tableview的使用以及自定義cell結合來感受MVC設計模式。 1、在ZPMainController.m檔案中 (1)通過懶載入獲取到模型資料,儲存到陣列helps中 <span style="font

JNIc/c++呼叫java建構函式

有時候c/c++是面向過程編碼,很多有用工具類都沒有,要編碼人員自己實現,如果可以呼叫java大量存在的類豈不是更省事更簡潔。 下面是通過呼叫java的Date類產生是時間戳。 public class JniConsTest { //c訪問java建構函式,並返回物件

Android Studio3.0開發JNI流程------Java呼叫C++以及C++呼叫Java

上一章講解了JNI中一些函式表的說明,這節開始講解Java與C++互調的過程。 在Android Studio3.0中建立一個支援JNI開發的Android程式。 編寫activity_main.xml佈局: <?xml version="1.0

C++在建構函式中可以呼叫另一個建構函式

題目如下:問下列程式碼的列印結果為0嗎? #include <stdlib.h> #include <iostream> using namespace std; struct CLS

C++呼叫 python 函式及返回值的處理元組,字串...

http://www.cnblogs.com/DxSoft/archive/2011/04/01/2002676.html Python 指令碼  py_test.py : #coding:utf-8 def get_int( ): a = 10 b =

[JNI]開發之旅(7)JNI函式呼叫java物件的方法

在jni函式中我們不僅要對java物件的資料域進行訪問,而且有時也需要呼叫java中類物件已經實現的方法。接下來我們對物件的方法呼叫,呼叫步驟與訪問資料域相似。 1.獲得例項對應的class類 2.根據class類獲得方法的method id 3.根據me