2012-11-14 26 views
7

मुझे मूल कोड (सी भाषा कोड) और एंड्रॉइड कोड के बीच कॉल बैक बनाने की आवश्यकता है। मैं यहाँ इसएंड्रॉइड कोड और मूल कोड के बीच कॉलबैक कैसे बनाएं?

JNI कोड की तरह एंड्रॉयड से C code फोन करने के लिए 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();   
    } 
} 

सी कोड की तरह दिखता है इस

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; 
} 

इस कोड को मैं सी भाषा में उपयोग कर रहा हूँ है, जेएनआई से initSocket() फ़ंक्शन को कॉल करना। अब मैं इस C code से on_status1 फ़ंक्शन को कॉल करने के लिए callback बनाना चाहता हूं। यह on_status1 कुछ सेकंड में दोहराएगा जब कभी इसे कहा जाता है मैं एंड्रॉइड कोड में एक फ़ंक्शन कॉल करना चाहता हूं।

संपादित

मैं इस तरह की कोशिश की, लेकिन

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);    
    } 

मैं एंड्रॉयड कोड में इस तरह समारोह घोषित किया गया था सफल नहीं।

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

उत्तर

6

से देखते हैं कि यह प्रयास करें:

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); 
    } 
1

जावा कोड से:

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

और सी में फोन:

typedef struct JniSMSMethodInfo 
{ 
    JNIEnv * env; 
    jclass  classID; 
    jmethodID methodID; 
} JniMethodInfo; 

extern "C" 
{ 
static JNIEnv* getJNIEnv(void) 
{ 

    JavaVM* jvm = cocos2d::JniHelper::getJavaVM(); 
    if (NULL == jvm) { 
     LOGD("Failed to get JNIEnv. JniHelper::getJavaVM() is NULL"); 
     return NULL; 
    } 

    JNIEnv *env = NULL; 
    // get jni environment 
    jint ret = jvm->GetEnv((void**)&env, JNI_VERSION_1_4); 

    switch (ret) { 
     case JNI_OK : 
      // Success! 
      return env; 

     case JNI_EDETACHED : 
      // Thread not attached 

      // TODO : If calling AttachCurrentThread() on a native thread 
      // must call DetachCurrentThread() in future. 
      // see: http://developer.android.com/guide/practices/design/jni.html 

      if (jvm->AttachCurrentThread(&env, NULL) < 0) 
      { 
       LOGD("Failed to get the environment using AttachCurrentThread()"); 
       return NULL; 
      } else { 
       // Success : Attached and obtained JNIEnv! 
       return env; 
      } 

     case JNI_EVERSION : 
      // Cannot recover from this error 
      LOGD("JNI interface version 1.4 not supported"); 
     default : 
      LOGD("Failed to get the environment using GetEnv()"); 
      return NULL; 
    } 
} 
// get class and make it a global reference, release it at endJni(). 
static jclass getClassID(JNIEnv *pEnv) 
{ 
    jclass ret = pEnv->FindClass(CLASS_NAME); 
    if (! ret) 
    { 
     LOGD("Failed to find class of %s", CLASS_NAME); 
    } 

    return ret; 
} 
static bool getStaticMethodInfo(JniMethodInfo &methodinfo, const char *methodName, const char *paramCode) 
{ 
    jmethodID methodID = 0; 
    JNIEnv *pEnv = 0; 
    bool bRet = false; 

    do 
    { 
     pEnv = getJNIEnv(); 
     if (! pEnv) 
     { 
      break; 
     } 

     jclass classID = getClassID(pEnv); 

     methodID = pEnv->GetStaticMethodID(classID, methodName, paramCode); 
     if (! methodID) 
     { 
      LOGD("Failed to find static method id of %s", methodName); 
      break; 
     } 

     methodinfo.classID = classID; 
     methodinfo.env = pEnv; 
     methodinfo.methodID = methodID; 

     bRet = true; 
    } while (0); 

    return bRet; 
} 
void callback(char* value){ 
    JniMethodInfo methodInfo; 
    if (! getStaticMethodInfo(methodInfo, "callback", METHOD_SIGNATURE)) 
    {    
     return; 
    } 

    jstring stringArg = methodInfo.env->NewStringUTF(value); 
    methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg1); 
    methodInfo.env->DeleteLocalRef(stringArg); 
    methodInfo.env->DeleteLocalRef(methodInfo.classID); 
} 

} 

CLASS_NAME:/ METHOD_SIGNATURE: यह फ़ाइल * .class

+0

पहले से ही मेरे पास जेएनआई कोड में एक init() फ़ंक्शन है, मैं jni से केवल init() कोड को कॉल कर रहा हूं, यह c कोड में functio() को कॉल करेगा, जब फ़ंक्शन() कहा जाता है कि मुझे एंड्रॉइड में एक फ़ंक्शन कॉल करना है देशी कोड फार्म। यह जरूरी है, मुझे आपके आर कोड से नहीं मिला .. क्या आप इसे संक्षेप में विस्तारित कर सकते हैं क्योंकि मैं एनडीके और जेएनआई के लिए नया हूं .. –

+0

मुझे कुछ प्रश्न के साथ मेरा प्रश्न संपादित किया गया था, क्या आप इस पर मेरी मदद कर सकते हैं .. –