我想使用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
为NULL
。
请注意,jobj
参数是我传递的对象,其中包含setPcmLeft
实现。
答案 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");