【发布时间】:2012-11-02 20:26:05
【问题描述】:
我需要在本机代码(c 语言代码)和 Android 代码之间创建回调。
我编写了 JNI 函数,用于像这样从 android 调用 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();
}
}
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 接口回调到 Java 代码,您是如何设法从本机库回调到 Java 的?我们将如何在本机代码中获取 JNIEnv?
标签: android android-ndk native-code