JNIサブスレッドでJava静的メソッドを呼び出すコードを共有

1317 ワード

============================================================
博文オリジナル、転載は出典を声明してください
電子コーヒー(元idブルー岩)
============================================================
JNIサブスレッドでJava静的メソッドを呼び出すコードを共有し、byte配列を渡し、実際のテストで使用できます.
JNIEnv *env;
jmethodID mid;

//JNI         java  ,    static  
//Attach    g_jvm  JavaVM*
if(g_jvm->AttachCurrentThread(&env, NULL) != JNI_OK)
{
  LOGE("%s: AttachCurrentThread() failed", __FUNCTION__);
  return NULL;
 }
//      
if(cls==NULL){
	cls = env->GetObjectClass(g_obj);
}
if(cls == NULL)
{
   LOGE("FindClass() Error.....");

}
//         
mid = env->GetStaticMethodID(cls, "JdisPlay", "([BII)V");
if (mid == NULL)
{
	LOGE("FindClass() Error.....");

}
int len=mWidth*mHeight*3/2;
jint w=mWidth;
jint h=mHeight;
LOGE("width = %d and height=%d",w,h);
//   byte  ,  :    
jbyteArray byteArr = (env)->NewByteArray(len);
//      C byte     java byte[]
jboolean isCopy;
void *data = env->GetPrimitiveArrayCritical((jarray)byteArr, &isCopy);
memcpy(data, mOutputFrameBuffer, len);

//      
env->CallStaticVoidMethod(cls, mid, byteArr,w,h);

//         array,      
(env)->ReleasePrimitiveArrayCritical(byteArr, data, JNI_ABORT);
(env)->DeleteLocalRef(byteArr);