如何在android代码和本机代码之间创建回调? [英] How to create callbacks between android code and native code?

查看:27
本文介绍了如何在android代码和本机代码之间创建回调?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在本机代码(c 语言代码)和 Android 代码之间创建回调.我编写了 JNI 函数,用于像这样从 android 调用 C 代码

I have a requirement for creating call backs between native code ( c language code) and Android code . I wrote JNI functions for calling C code from the android like this

这里是 JNI 代码

#include <android/log.h>

void initSocket(); 

#ifdef __cplusplus
extern "C" {
#endif

  JNIEXPORT void JNICALL Java_org_pjsip_pjsua_pjsua_1appJNI_initSocket(JNIEnv *jenv, jclass jcls) {

    __android_log_write(ANDROID_LOG_INFO, " JNI CODE ", " APP INIT SOCKET");        
    initSocket();        
  }
}

C 代码如下所示

void initSocket()
{
    /// some more stuff
    printf("  initSocket function ");           
}

static int worker_thread(void *unused)
{       
    /// some more stuff
    return 0;
}

pj_bool_t on_rx_data1(pj_stun_sock *stun_sock, void *pkt, unsigned pkt_len, const pj_sockaddr_t *src_addr, unsigned addr_len)
{      
    /// some more stuff    
    return PJ_TRUE;
}

pj_bool_t on_data_sent1 (pj_stun_sock *stun_sock, pj_ioqueue_op_key_t *send_key, pj_ssize_t sent)
{        
    /// some more stuff
    return PJ_TRUE;  
}
pj_bool_t on_status1(pj_stun_sock *stun_sock, pj_stun_sock_op op, pj_status_t status)
{        
    /// some more stuff
    returnsockaddress();            
    return PJ_TRUE;
}

char* returnsockaddress()
{     
    /// some more stuff   
    return ipinttostring(sock_address);
}

char* ipinttostring(unsigned int addr )
{       
    /// some more stuff
    return fullIP;
}

这是我在 C 语言中使用的代码,从 JNI 调用 initSocket() 函数.现在我想在此代码中调用 on_status1 函数时从此 C 代码 创建一个 callback.这个 on_status1 将在几秒钟内重复,当它被调用时,我想在 android 代码中调用一个函数.

this is the code i am using in C language, calling initSocket() function from JNI. Now i want to create a callback from this C code when on_status1 function called in this code. this on_status1 will repeat in few seconds when ever it's called i want to call a function in android code.

编辑

我试过这样,但没有成功

I tried like this, but not succeeded

JNIEXPORT void JNICALL Java_org_pjsip_pjsua_pjsua_1appJNI_initSocket(JNIEnv *jenv, jobject obj) {

      __android_log_write(ANDROID_LOG_INFO, " JNI CODE ", " APP INIT SOCKET");            
      initSocket();             
      jclass cls = jenv->GetObjectClass(obj);
      jmethodID methodid = env->GetMethodID(cls, "callback", "()V");            
      if(!methodid) {
          return;
      }            
      jenv->CallVoidMethod(obj , methodid);            
  }

我在 android 代码中被声明为这样的函数.

I was declared function like this in android code.

public static void callback(String value) {
    Log.e(TAG, "value:" + value);
}

推荐答案

试试这个:

JNIEXPORT void JNICALL Java_org_pjsip_pjsua_pjsua_1appJNI_initSocket(JNIEnv *jenv, jobject obj) {
  __android_log_write(ANDROID_LOG_INFO, " JNI CODE ", " APP INIT SOCKET");            
  initSocket();             
  // jclass cls = (*jenv)->GetObjectClass(jenv, obj);
  // or something like this :
  jclass cls = (*jenv)->FindClass(jenv, "org/pjsip/pjsua/pjsua_appJNI"); 
  jmethodID methodid = (*jenv)->GetStaticMethodID(jenv, cls, "callback", "(Ljava/lang/String;)V");            
  if(!methodid) {
      return;
  }       
  jstring jstr = (*jenv)->NewStringUTF(jenv, "Hello from C"); 
  (*jenv)->CallStaticVoidMethod(jenv, cls, methodid, jstr); 
  }

这篇关于如何在android代码和本机代码之间创建回调?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆