最近在移植网络摄像机里的p2p库到android平台,需要用到jni,最近在c线程了调用java函数的时候
出现一个问题,假如在同一个线程调用java函数是没问题的,但在一个c线程了调用java函数就出现奔
溃问题,下面就直接贴c线程里调用java函数的流程代码吧:

步骤1. 我这里的应用是,java处理视频播放,在java层写需要调用的函数,例如:

private void recvData(String devid, byte[] data, int nDataType, int nLen){
Log.i(TAG, "recv id:"+devid+", type:"+nDataType+", len:"+nLen);
}

步骤2. 在native-lib.cpp中jni层代码如下(注意这是c++代码):

JavaVM* local_JavaVM = NULL;
jobject j_obj = NULL;
jmethodID j_mid = NULL;
JNIEXPORT void JNICALL Java_com_p2p_test_MainActivity_InitP2P (JNIEnv *env, jobject jobj) {
jclass clazz = env->GetObjectClass(jobj);
j_obj = env->NewGlobalRef(jobj);//**这里是关键**
//jclass clazz = env->GetObjectClass(jobj);//之前是这样写,一直导致奔溃
j_mid = env->GetMethodID(clazz, "recvData", "(Ljava/lang/String;[BII)V");
if(j_mid == NULL)
{
LOGE("Error GetMethodID");
}
} jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
LOG("JNI_OnLoad");
local_JavaVM = vm ; JNIEnv* env = ;
jint ret = -; if (vm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK)
{
LOGE("JNI_OnLoad error");
goto onLoadError;
} ret = JNI_VERSION_1_6; onLoadError:
return ret;
}

步骤3.我这里的应用p2p在收到视频流数据的时候,需要将视频数据传送到java层,例如其他c文件xxxxx.c收到视频数据,在调用CallVoidMethod可以调用java函数(注意这是c代码)。

extern jmethodID j_mid ;
extern jobject j_obj ;
extern JavaVM* local_JavaVM;
JNIEnv *env;
**//这是一个线程**
void dataRecvThread()
{
int ret = ;
int status = (*local_JavaVM)->GetEnv(local_JavaVM, (void **)&(env), JNI_VERSION_1_6);
if(status < )
{
status = (*local_JavaVM)->AttachCurrentThread(local_JavaVM, &(env), NULL);//**这是关键地方**
if(status < )
{
return NULL;
}
ret= ;
} ..............//接受视频代码省略
if(j_obj != NULL && j_mid != NULL)
{
int nDataType = data.frameType;
int nLen = data.len;
jstring jdevid = (*env)->NewStringUTF(env, "ARD1W45LKUYHAAAA1E");
jbyteArray jbuff = (*env)->NewByteArray(env, nLen);
(*env)->CallVoidMethod(env, j_obj , j_mid , jdevid, jbuff, nDataType, nLen);
(*env)->DeleteLocalRef(env, jbuff);
(*env)->DeleteLocalRef(env, jdevid);
}
.............//代码省略 if(ret)
{
(*local_JavaVM)->DetachCurrentThread(local_JavaVM);
}
}

这样就可以成功调用了

Android jni c/c++线程通过CallVoidMethod调用java函数出现奔溃问题的更多相关文章

  1. Android JNI入门第六篇——C调用Java

    本篇将介绍在JNI编程中C调用Java实现. 源码下载地址:http://download.csdn.net/detail/xyz_lmn/4868265 关键代码: java: public cla ...

  2. Android JNI开发之C/C++层调用JAVA

    一.从C/C++层调用JAVA层代码(无参数调用) //在c代码里面调用java代码里面的方法 // java 反射 // 1 . 找到java代码的 class文件 // jclass (*Find ...

  3. LoadRunner调用java函数测试oracle

    LoadRunner调用java函数测试oracle 测试oracle的方法有很多,可以使用loadrunner的oracle协议直接调用oracle进行测试,也可以调用开发的java程序对oracl ...

  4. 基于 Android NDK 的学习之旅----- C调用Java

    许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态 ...

  5. Android NDK 学习之调用Java函数

    本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...

  6. Android jni/ndk编程三:native访问java

    一.访问静态字段 Java层的field和method,不管它是public,还是package.private和protected,从 JNI都可以访问到,Java面向语言的封装性不见了. 静态字段 ...

  7. Android NDK 学习之在C中调用Java的变量和静态变量

    本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...

  8. JS调用Java函数--DWR框架

    (1)dwr与ssh框架整合教程dwr框架介绍. DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJA ...

  9. 在NDK C++线程中如何调用JAVA API

    from://http://www.eoeandroid.com/thread-150995-1-1.html 在NDK中创建的线程中, 只允许调用静态的Java API. 当在线程中调用env-&g ...

随机推荐

  1. Shell-14--awk

    awk ' 条件1{ 动作1} 条件2{动作2}...' 文件名 awk处理数据是 先读取第一行 然后再去处理 printf 不会加入换行符,需要手动加入 print 会自动加换行 begin 是在后 ...

  2. linux下的shell脚本的使用

    什么是shell? Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户.这种对话方式可是交互 ...

  3. LeetCode--No.001 Two Sum

    Two Sum Total Accepted: 262258 Total Submissions: 1048169 Difficulty: Easy Given an array of integer ...

  4. RPC的原理总结

    一.RPC的引入 早期单机时代,一台电脑上运行多个进程,大家各干各的,老死不相往来.假如A进程需要一个画图的功能,B进程也需要一个画图的功能,程序员就必须为两个进程都写一个画图的功能.这不是整人么?于 ...

  5. 7.28-说说对javaweb的感想吧

    接触了几个月的java,和javaweb. 感想1:发现生活顿时充实了很多,时间照样在过,日落日出,但是手里面有学的,有可以让自己开心地码出理想的效果,这是很不错的结局. 发现自己再也不回去和伙伴们撸 ...

  6. Spring Boot + Spring Cloud 构建微服务系统(八):分布式链路追踪(Sleuth、Zipkin)

    技术背景 在微服务架构中,随着业务发展,系统拆分导致系统调用链路愈发复杂,一个看似简单的前端请求可能最终需要调用很多次后端服务才能完成,那么当整个请求出现问题时,我们很难得知到底是哪个服务出了问题导致 ...

  7. await和async在一般处理程序中的使用

    写在前面 有个小项目,前端使用的html页面,那服务端的业务处理就采用最简单的一般处理程序了,之前一直在用,觉得一直用一种方式,确实挺蛋疼的,之前也有了解过async和await的内容.就想着自己折腾 ...

  8. Java设计模式学习记录-责任链模式

    前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...

  9. C# 反射和Type类

    一.元数据和反射 1.1 定义 大多数程序都要处理数据,包括读.写.操作和显示数据.然而,对于某些程序来说,它们操作的不是数字.文本或图形,而是程序和程序类型本身的信息. ● 有关程序及其类型的数据被 ...

  10. [NOI 2017]整数

    Description 题库链接 P 博士将他的计算任务抽象为对一个整数的操作. 具体来说,有一个整数 \(x\) ,一开始为 \(0\) . 接下来有 \(n\) 个操作,每个操作都是以下两种类型中 ...