2013-05-13 88 views
4

我想使用JNI(Java本地接口)來調用特定的java setter方法,並將短的[]緩衝區作爲參數傳遞給它。如何使用JNI從C調用JAVA方法C

Java方法執行力度如下所示:

public void setPcmLeft(short[] data) { pcm_l = data; } 

從我的C函數裏面我怎麼能叫使用JNI此方法。

我的代碼目前看起來是這樣的:

void Java_com_companyName_lame_LameActivity_lameDecode(JNIEnv *env, jobject jobj) 
{ 
    jclass class = (*env)->GetObjectClass(env, jobj); 

    if (class != NULL) { 

     jmethodID setLeftDatatID = (*env)->GetMethodID(env, class, "<setPcmLeft>", "void(V)"); 
     if (setLeftDatatID == NULL) { 
      LOGD("(Lame) No method setLeftData"); 
     } 
    } 
} 

當我運行這一點,setLeftDataID是allays NULL

請注意,jobj參數是我傳入的對象,其中包含setPcmLeft實現。

回答

3

在調用GetMethodID(),方法名稱不需要尖括號和簽名需要匹配的Java方法。

jmethodID setLeftDatatID = (*env)->GetMethodID(env, class, "setPcmLeft", "([S)V"); 

一般來說,簽名的格式爲(arg-types) ret-type,按照以下鏈接中的規定進行編碼。該參數是一個簡短的[],編碼爲[S。退貨類型爲V無效。

更多信息請見Chapter 3 of the Oracle JNI guide

+0

非常感謝Andy的工作。 – Sabobin 2013-05-13 20:33:50

+0

我們什麼時候需要尖括號?我看到這樣的代碼'jmethodID m_mid = env - > GetMethodID(m_cls,「」,「()V」); ' – smwikipedia 2014-12-05 15:11:24

+1

@smwikipedia - 您需要使用特殊名稱'',其中'GetMethodID()'支持允許引用構造函數。 *「要獲得構造函數的方法ID,請提供作爲方法名稱,void(V)作爲返回類型。」* - 來自http://docs.oracle.com中'GetMethodID()'的文檔/javase/6/docs/technotes/guides/jni/spec/functions.html。 – 2014-12-05 16:14:43

1

試試這個:

jmethodID midCallBack = (*env)->GetMethodID(env, class, "setPcmLeft", "([S)V"); 
+0

您可以使用CallVoidMethod *()函數之一。 – 2013-05-13 20:34:49

+0

這是如何工作的,上面的答案是否奏效? – 2013-05-13 20:36:04

+0

他可能在沒有「[S」的情況下使用過您的早期版本。 – 2013-05-13 20:37:41