如何创建的安卓code和本土code回调? [英] How to create callbacks between android code and native code?
问题描述
我有创造的原生code(C语言code)和Android code回调的要求。
我写了JNI函数调用 C $ C $ç
从像这样的机器人
JNI code此处
的#include<安卓/ log.h>
无效initSocket();
的#ifdef __cplusplus
为externC{
#ENDIF
JNIEXPORT无效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 code相类似这样
无效initSocket()
{
///一些更多的东西
的printf(initSocket功能);
}
静态INT worker_thread(无效*未使用)
{
///一些更多的东西
返回0;
}
pj_bool_t on_rx_data1(pj_stun_sock * stun_sock,无效* PKT,无符号pkt_len,常量pj_sockaddr_t * SRC_ADDR,无符号addr_len)
{
///一些更多的东西
返回PJ_TRUE;
}
pj_bool_t on_data_sent1(pj_stun_sock * stun_sock,pj_ioqueue_op_key_t * send_key,pj_ssize_t发送)
{
///一些更多的东西
返回PJ_TRUE;
}
pj_bool_t on_status1(pj_stun_sock * stun_sock,pj_stun_sock_op运,pj_status_t状态)
{
///一些更多的东西
returnsockaddress();
返回PJ_TRUE;
}
字符* returnsockaddress()
{
///一些更多的东西
返回ipinttostring(sock_address);
}
字符* ipinttostring(无符号整数地址)
{
///一些更多的东西
返回fullIP;
}
这是在$ C $词是用C语言,要求从JNI initSocket()
功能。现在,我想创建一个回调
此 C $ C $ç
在 on_status1
函数调用这个code。这on_status1将重复在几秒钟内当过它被称为我想打电话给在安卓code函数。
修改
我想这样,但没有成功。
JNIEXPORT无效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,回调,()V);
如果(!放在methodID){
返回;
}
jenv-> CallVoidMethod(OBJ,放在methodID);
}
像这样的机器人code
我被宣布功能。
公共静态无效的回调(字符串值){
Log.e(TAG,值+值);
}
试试这个:
JNIEXPORT无效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);
//或者是这样的:
JCLASS CLS =(* jenv) - >的findClass(jenv,组织/ PJSIP / pjsua / pjsua_appJNI);
jmethodID放在methodID =(* jenv) - > GetStaticMethodID(jenv,CLS,回调,(Ljava /朗/字符串;)V);
如果(!放在methodID){
返回;
}
的jstring jstr =(* jenv) - > NewStringUTF(jenv,你好,从C);
(* jenv) - > CallStaticVoidMethod(jenv,CLS,放在methodID,jstr);
}
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 code here
#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 code looks like this
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;
}
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.
EDIT
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);
}
I was declared function like this in android code.
public static void callback(String value) {
Log.e(TAG, "value:" + value);
}
Try this :
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);
}
这篇关于如何创建的安卓code和本土code回调?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!