gpt4 book ai didi

android - 如何在android代码和 native 代码之间创建回调?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:44 28 4
gpt4 key购买 nike

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

这里是 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 代码 创建一个 回调。这个 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);
}

最佳答案

试试这个:

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 - 如何在android代码和 native 代码之间创建回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13377168/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com