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