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



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

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总是NULL

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

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

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

一般来说,签名的格式为( arg-types ) ret-type,编码如下面的链接所示。参数是一个短的[],编码为[S。void的返回类型是V

更多信息请参见Oracle JNI指南第3章

试试这个:

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

相关内容

  • 没有找到相关文章

最新更新