如何使用JNI从C调用JAVA方法

时间:2013-05-13 20:16:54

标签: java c java-native-interface jniwrapper

我想使用JNI(Java Native Interface)来调用特定的java setter方法,将short []缓冲区作为参数传递给它。

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");
        }  
    } 
}

运行时,setLeftDataIDNULL

请注意,jobj参数是我传递的对象,其中包含setPcmLeft实现。

2 个答案:

答案 0 :(得分:3)

在对GetMethodID()的调用中,方法名称不需要尖括号,签名需要与Java方法匹配。

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

通常,签名的格式为( arg-types ) ret-type,其编码方式如下面的链接所示。参数是short [],编码为[S。 void的返回类型为V

Chapter 3 of the Oracle JNI guide中提供了更多信息。

答案 1 :(得分:1)

试试这个:

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