我有要求在本機代碼(c語言代碼)和Android代碼之間創建回調。 我寫JNI功能從Android調用C code
這樣如何在android代碼和本機代碼之間創建回調?
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 code
創建一個callback
。這個on_status1將在幾秒鐘內重複,當它被稱爲我想在android代碼中調用一個函數。
編輯
我想這樣的,但沒有成功
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的代碼。
public static void callback(String value) {
Log.e(TAG, "value:" + value);
}
我已經在JNI代碼中有一個init()函數,我只從jni調用init()代碼,它會調用c代碼中的functio(),當function()調用時我必須調用android中的函數形成本地代碼。這是要求,我沒有得到你的代碼..你可以簡單地擴展它,因爲我是NDK和JNI的新手.. –
我被編輯了一些代碼我的問題可以幫助我在這.. –