4

我想使用 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");
        }  
    } 
}

当我运行它时,它setLeftDataID是 allays NULL

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

4

2 回答 2

3

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

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

通常,签名的格式( arg-types ) ret-type为 ,按照以下链接中的说明进行编码。参数是一个 short[],编码为[S. 返回类型V为 void。

Oracle JNI 指南的第 3 章提供了更多信息。

于 2013-05-13T20:29:44.920 回答
1

试试这个:

   jmethodID midCallBack = (*env)->GetMethodID(env, class, "setPcmLeft", "([S)V");
于 2013-05-13T20:28:55.743 回答