关闭

Android NDK: 子线程中C调用Java

3544人阅读 评论(0) 收藏 举报
分类:
在底层c++生成的子线程中调用Java,需要JniEnv。而这个JniEnv的生成,需要用AttachCurrentThread方法。

1. 获取JVM,以及静态方法实例
static JavaVM* g_JavaVM = NULL;
static jobject gInterfaceObject;

void initClassHelper(JNIEnv *env, const char *path, jobject *objptr) {
    jclass cls = env->FindClass(path);
    if(!cls) {
        LOGE("initClassHelper: failed to get %s class reference", path);
        return;
    }
    jmethodID constr = env->GetMethodID(cls, "<init>", "()V");
    if(!constr) {
        LOGE("initClassHelper: failed to get %s constructor", path);
        return;
    }
    jobject obj = env->NewObject(cls, constr);
    if(!obj) {
        LOGE("initClassHelper: failed to create a %s object", path);
        return;
    }
    (*objptr) = env->NewGlobalRef(obj);
}


JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
{
    g_JavaVM = vm;
    JNIEnv *env = NULL;
int status = g_JavaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
if (status < 0) {
LOGE("get env failure");
return JNI_VERSION_1_6;
}
initClassHelper(env, "com/iptv/epg/Inform", &gInterfaceObject);
    return JNI_VERSION_1_6;
}

根据g_JavaVM可以得到JniEnv,根据gInterfaceObject可以得到相应的class。

2. 在子线程中调用Java方法
下面的代码与1中代码处于不同线程。
JNIEnv *jniEnv = NULL;
bool isAttached = false;
//获取env
int status = g_JavaVM->GetEnv((void **) &jniEnv, JNI_VERSION_1_6);
if(status < 0) {
__android_log_print(ANDROID_LOG_INFO, "SuIPTV", "[%s] failed to get JNI environment", __FUNCTION__);
//如果是在子线程中,应该以AttachCurrentThread获取env
status = g_JavaVM->AttachCurrentThread(&jniEnv, NULL);
if(status < 0) {
LOGE("callback_handler: failed to attach current thread");
return;
} else {
isAttached = true;
LOGE("callback_handler: ttach current thread success");
}
//获取对应class
jclass InformProvider = jniEnv->GetObjectClass(gInterfaceObject);
if(!InformProvider) {
LOGE("callback_handler: failed to get class reference");
if(isAttached) g_JavaVM->DetachCurrentThread();
return;
} else {
LOGE("callback_handler: get class reference success");
}
//获取静态方法
jmethodID playEnd = jniEnv->GetStaticMethodID(InformProvider, "playEnd","()V");
if(!playEnd) {
LOGE("callback_handler: failed to get method ID");
if(isAttached) g_JavaVM->DetachCurrentThread();
return;
} else {
LOGE("callback_handler: get method ID success");
}
//调用Java方法
jniEnv->CallStaticObjectMethod(InformProvider, playEnd);
if(isAttached) g_JavaVM->DetachCurrentThread();
__android_log_print(ANDROID_LOG_INFO, "SuIPTV", "[%s] CallStaticObjectMethod", __FUNCTION__);
3. 被调用的Java方法如下
public class Inform {

public static void playEnd() {

}
}

另外,利用javap生成方法签名:
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

NDK使用技巧、多线程调用注意、ndk中的工具使用

//NDK 使用技巧和多线程调用注意 //http://www.ibm.com/search/csass/search/?q=ndk&sn=dw&lang=zh&cc=CN&en=utf&hpp=20...
  • earbao
  • earbao
  • 2016-05-08 00:33
  • 4265

Android ndk 线程回调java层方法

项目上刚好要在ndk层使用线程
  • zhengxinwcking
  • zhengxinwcking
  • 2014-04-29 17:09
  • 3839

Android NDK开发(五)——C代码回调Java代码

在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部分的实际开发知识,基本上掌握这些就可以做一个基本的NDK开发了,但是光是了解Java回调C层的数据是不是还不够啊,考虑问题要考虑可逆...
  • lee_tianya
  • lee_tianya
  • 2015-01-05 09:27
  • 5486

android NDK(java调用C)

  • 2016-11-15 09:54
  • 23.18MB
  • 下载

Android NDK c创建新的线程

在jni的c/c++层创建一个新的线程只需要3步: 1.导入库 #include 2.写好线程要做的事 void* run_1(void*); void* run_1(void* args)...
  • jrunw
  • jrunw
  • 2017-03-17 10:20
  • 268

Android NDK入门,C与Java的互相调用Demo

  • 2015-11-20 15:28
  • 2.58MB
  • 下载

Android NDK c创建新的线程

在jni的c/c++层创建一个新的线程只需要3步: 1.导入库 #include 2.写好线程要做的事 void* run_1(void*); void* run_1(void* args)...
  • q291611265
  • q291611265
  • 2015-04-24 18:46
  • 2680

Android NDK 线程回调Java层方法

转自:http://www.linuxidc.com/Linux/2015-02/112689.htm 项目上刚好要在Android NDK层使用线程回调Java层方法,仅以此文做个总结。线...
  • hjwang1
  • hjwang1
  • 2015-03-20 18:52
  • 595

Android NDK开发之C调用Java及原生代码断点调试(二)

上一篇中,我们主要学习了Java调用本地方法,并列举了两大特殊实例来例证我们的论据,还没学习的伙伴必须先去阅读下,本次的学习是直接在上一篇的基础上进行了。点击:Android NDK开发之从Java与...
  • guiman
  • guiman
  • 2017-05-11 11:43
  • 624

Android NDK开发(1)----- Java与C互相调用实例详解

Android NDK开发(1)----- Java与C互相调用实例详解 一、概述       对于大部分应用开发者来说可能都不怎么接触到NDK,但如果涉及到硬件操作的话就不得不使用NDK了。使用...
  • u014033218
  • u014033218
  • 2014-04-09 23:01
  • 861
    个人资料
    • 访问:592079次
    • 积分:7631
    • 等级:
    • 排名:第3263名
    • 原创:190篇
    • 转载:6篇
    • 译文:0篇
    • 评论:98条
    博客专栏
    文章分类
    最新评论