//打印信息
#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);
}