分享一段JNI子线程中调用Java静态方法的代码
2013-04-20 15:41
513 查看
============================================================博文原创,转载请声明出处电子咖啡(原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);
分享一段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);
相关文章推荐
- 入门: 使用JNI 从C++代码中调用Java的静态方法
- Java实现等待所有子线程结束后再执行一段代码的方法
- java中,多个线程同时调用同一个静态方法的问题
- 四、成员方法、构造方法、普通代码块、构造代码块、静态代码块应用技术分享
- JNI里面调用Java,JNI非JAVA线程里面调用Java方法
- 【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)
- java中静态方法为什么不能调用非静态方法或者变量
- 【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)
- JAVA -- 线程的sleep()方法为什么是静态的
- java中静态方法中调用非静态方法
- java代码--------构造方法的调用
- java静态代码调用顺序
- java检查服务器的连通两种方法代码分享
- java多线程并发去调用一个类的静态方法安全性探讨
- Java中可以直接调用类中静态方法,不用实例化
- java 非静态类调用静态方法的误区
- Java中通过为null的引用调用静态方法
- cocos2d-x 分享某类的静态实例方法与调用
- JNI学习笔记:(1)开篇(2)本地代码访问Java代码 (3)本地方法取得Java属性/调用java方法 (4)本地代码创建Java对象(包括javaString) (5) 本地方法处理java数组
- 多个线程调用静态方法,是否会出现并发问题?