JNI回调数据给android

//打印信息

#include <android/log.h>

//#include "CallBackManage.h"
// log标签
#define  TAG    "PNVClientControl"
// 定义info信息

#define _Debug(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)


//调用JNI时都会自动调用JNI_OnLoad函数

#define JNI_VERSION JNI_VERSION_1_4

static JavaVM         *g_JavaVm = NULL;

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
void *pEnv;
_Debug("JNI_OnLoad!");
if (vm->GetEnv((void**)&pEnv, JNI_VERSION) != JNI_OK)
{
_Debug("ERROR: GetEnv failed");
return RET_FAIL;
}
g_JavaVm = vm;
return JNI_VERSION;
}

//定义全局数据

typedef struct cbData{
jobject  m_jObject;
jclass   m_jClass;
jmethodID m_jMethodID;
}CBData;


CBData g_cbData;

//c++回调上来的回调函数,在另一个线程中
int MyVideoListCallBack(vector<string>* vect,ULong lUser)
{
if(vect != NULL)
{
/******************************************************************************************************************/
//获得该线程的环境变量JNIEnv
JNIEnv* pEnv = NULL;
int iStatus = g_JavaVm->GetEnv((void**)&pEnv, JNI_VERSION);
if ( iStatus < 0 )
{
_Debug("g_JavaVm->GetEnv < 0");

iStatus = g_JavaVm->AttachCurrentThread((JNIEnv**)&pEnv, NULL);
if ( iStatus < 0 )
{
_Debug("g_JavaVm->AttachCurrentThread < 0");
return -1;
}
}

//获得回调函数所在的类的对象,GetResponse为回调的android中接口的函数名,([Ljava/lang/String;)I 代表参数为String[] ,返回值为int
g_cbData.m_jClass =  pEnv->GetObjectClass(g_cbData.m_jObject);
g_cbData.m_jMethodID = pEnv->GetMethodID(g_cbData.m_jClass,"GetResponse","([Ljava/lang/String;)I");

//创建数组
jstring      str;
jobjectArray args = 0;
jsize        jlen = vect->size();
int           i = 0;
args = (pEnv)->NewObjectArray(jlen,(pEnv)->FindClass("java/lang/String"),0);


/********************************************************************************************************************/

vector<string>::iterator iter;
for (iter=vect->begin();iter!=vect->end();iter++)
{
const char * pChar = (*iter).c_str();
_Debug("---------%s--------",pChar);

/***************************************************************************************************************/
//将数据存入数组
str = pEnv->NewStringUTF(pChar);
pEnv->SetObjectArrayElement(args, i, str);
pEnv->ReleaseStringUTFChars(str,pChar);
i++;
/***************************************************************************************************************/
}
//回调给android
pEnv->CallIntMethod(g_cbData.m_jObject,g_cbData.m_jMethodID,args);

//销毁线程
g_JavaVm->DetachCurrentThread();
delete vect;
vect = NULL;
}
   return 0;
}


//设置回调
JNIEXPORT jint JNICALL Java_com_rpok_pnv_PNVClientControl_SetCallBack
  (JNIEnv * env, jclass obj, jobject cb)
{
g_cbData.m_jObject = env->NewGlobalRef(cb);
return 0;
}

//注销回调
JNIEXPORT jint JNICALL Java_com_rpok_pnv_PNVClientControl_ResetCallBack
  (JNIEnv * env, jclass objCallBack, jobject objInterface)
{
env->DeleteGlobalRef(g_cbData.m_jObject);
return 0;
}


在android上创建接口ResponseInterface

//import android.R.string;
import java.lang.String;

public interface ResponseInterface {
public abstract int GetResponse(String []str);
}

//实现该接口

import java.lang.String;

public class ResponseClass implements ResponseInterface{
@Override
public int GetResponse(String []str) {

int len = str.length;
System.out.println("len = "+len);
for(int i = 0;i < len ;i++)
{
System.out.println("call back test = "+str[i]);
}


return 0;
}
}


//MainActivity中调用

private ResponseClass responseClass ;
static{
System.loadLibrary("gnustl_shared");
System.loadLibrary("PNVControlClient");
System.loadLibrary("JniPNVClientControl");
}

在 onCreate中调用

responseClass = new ResponseClass();
        PNVClientControl.SetCallBack(responseClass);

在onDestroy中调用

PNVClientControl.ResetCallBack(responseClass);


其中PNVClientControl类为

package com.rpok.pnv;


public class PNVClientControl {
public native static int WifiClientConInit();                      
public native static int WifiClientConUnInit();                   
public native static int Login(String ip);                       
public native static void Logout();                                    
public native static void ZoomBlowupCmd();                             
public native static void ZoomReduceCmd();                             
public native static void FaculaLargerCmd();                           
public native static void FaculaSmallCmd();                            
public native static void LaserOpenCmd();                              
public native static void LaserCloseCmd();                            
public native static void StopChangeCmd();                             
public native static void RemoteVideoPlaybackCmd(String dataTime);     
public native static void SetWifiNameCmd(String sName);         
public native static void SetWifiPasswordCmd(String sPassWord); 
public native static void GetWifiMsgCmd();

public native static int  SetCallBack(ResponseInterface responseInterface);
public native static int  ResetCallBack(ResponseInterface responseInterface);

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值