2013-05-13 111 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