SDK.h

 #ifndef SDK_H
#define SDK_H #include "AsyncProxy.h"
#include "Module.h"
#include <map>
#include <vector>
#include <string>
using std::map;
using std::vector;
using std::string; class SDK
{
private:
vector<Module*> m_modules;
AsyncProxy* mp_asyncProxy;
map<string,Method*> m_methodIndex;
private:
Method* checkMethod(string methodName, map<std::string, std::string> &params);
void init();
public:
SDK();
SDK(CallBackFun* p_exceptionFun);
~SDK();
void addModule(Module* p_module);
string request(string methodName, map<string,string>& params);
void requestAsync(string methodName, map<string, string> &params, CallBackFun* p_callBack = NULL);
}; #endif

CallBackFun.h

 class CallBackFun
{
public:
virtual ~CallBackFun(){}
virtual void callBack(string& result){SDK_DEBUG("%s",result.c_str());}
};

main.cpp

#include <string.h>
#include <jni.h>
#include "core/SDK.h" static JavaVM* p_vm = NULL; JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
{
p_vm = vm;
return JNI_VERSION_1_6;
} class JavaCallBackFun:public CallBackFun
{
private:
jobject m_object;
jstring m_method;
static const char* m_signature;
bool m_destroy;
public:
JavaCallBackFun( JNIEnv* env,jobject object,jstring method,bool destroy)
{
m_object = env->NewGlobalRef(object);
m_method = (jstring)env->NewGlobalRef(method);
m_destroy = destroy;
} ~JavaCallBackFun()
{
if(m_destroy == false)
{
JNIEnv* env;
p_vm->AttachCurrentThread(&env, NULL);
env->DeleteGlobalRef(m_object);
env->DeleteGlobalRef(m_method);
}
} void callBack(string& result)
{
JNIEnv* env;
p_vm->AttachCurrentThread(&env, NULL);
jstring jresult = env->NewStringUTF(result.c_str());
const char* methodStr = env->GetStringUTFChars(m_method, );
jclass clazz = env->GetObjectClass(m_object);
jmethodID methodID = env -> GetMethodID(clazz,methodStr,m_signature);
env -> CallVoidMethod(m_object,methodID,jresult);
env -> ReleaseStringUTFChars(m_method,methodStr);
if(m_destroy == true)
{
env->DeleteGlobalRef(m_object);
env->DeleteGlobalRef(m_method);
}
}
};
const char* JavaCallBackFun::m_signature = "(Ljava/lang/String;)V"; extern "C" {
JNIEXPORT jlong JNICALL Java_com_pptv_sdk_CommonSDK_initSDKNative( JNIEnv* env,jobject thiz,jobject callBackObj,jstring exceptionFun);
JNIEXPORT void JNICALL Java_com_pptv_sdk_CommonSDK_cleanSDKNative( JNIEnv* env,jobject thiz,jlong sdkptr);
JNIEXPORT jstring JNICALL Java_com_pptv_sdk_CommonSDK_requestNative( JNIEnv* env,jobject thiz,jlong sdkptr,jstring methodName,\
jobjectArray paramKeys,jobjectArray paramValues);
JNIEXPORT void JNICALL Java_com_pptv_sdk_CommonSDK_requestAsyncNative( JNIEnv* env,jobject thiz,jlong sdkptr,jstring methodName,\
jobjectArray paramKeys,jobjectArray paramValues,jobject callBackObj,jstring callBackMethod);
}; JNIEXPORT jlong JNICALL Java_com_pptv_sdk_CommonSDK_initSDKNative( JNIEnv* env,jobject thiz,jobject callBackObj,jstring exceptionFun)
{
JavaCallBackFun* p_callBack = new JavaCallBackFun(env,callBackObj,exceptionFun,false);
return (jlong)new SDK(p_callBack);
} JNIEXPORT void JNICALL Java_com_pptv_sdk_CommonSDK_cleanSDKNative( JNIEnv* env,jobject thiz,jlong sdkptr)
{
SDK* p_sdk = (SDK*)sdkptr;
delete p_sdk;
} JNIEXPORT jstring JNICALL Java_com_pptv_sdk_CommonSDK_requestNative( JNIEnv* env,jobject thiz,jlong sdkptr,jstring methodName,\
jobjectArray paramKeys,jobjectArray paramValues)
{
SDK* p_sdk = (SDK*)sdkptr;
const char * methodNameStr = env->GetStringUTFChars( methodName, );
//init param map
jstring jkey,jvalue;
jsize keysLen=env->GetArrayLength(paramKeys);
map<string,string> params;
for(jsize i=;i<keysLen;++i)
{
jkey = (jstring)(env->GetObjectArrayElement(paramKeys,i));
jvalue = (jstring)(env->GetObjectArrayElement(paramValues,i));
const char *key = env->GetStringUTFChars(jkey, );
const char *value = env->GetStringUTFChars(jvalue,);
params[string(key)] = string(value);
env->ReleaseStringUTFChars(jkey,key);
env->ReleaseStringUTFChars(jvalue,value);
} string result = p_sdk->request(methodNameStr,params);
env->ReleaseStringUTFChars(methodName,methodNameStr);
return env->NewStringUTF(result.c_str());
} JNIEXPORT void JNICALL Java_com_pptv_sdk_CommonSDK_requestAsyncNative( JNIEnv* env,jobject thiz,jlong sdkptr,jstring methodName,\
jobjectArray paramKeys,jobjectArray paramValues,jobject callBackObj,jstring callBackMethod)
{
SDK* p_sdk = (SDK*)sdkptr;
const char * methodNameStr = env->GetStringUTFChars(methodName, );
//init param map
jstring jkey,jvalue;
jsize keysLen=env->GetArrayLength(paramKeys);
map<string,string> params;
for(jsize i=;i<keysLen;++i)
{
jkey = (jstring)(env->GetObjectArrayElement(paramKeys,i));
jvalue = (jstring)(env->GetObjectArrayElement(paramValues,i));
const char *key = env->GetStringUTFChars(jkey, );
const char *value = env->GetStringUTFChars(jvalue,);
params[string(key)] = string(value);
env->ReleaseStringUTFChars(jkey,key);
env->ReleaseStringUTFChars(jvalue,value);
}
//init callback fun
JavaCallBackFun* p_callBack = NULL;
if(callBackObj != NULL && callBackMethod != NULL)
{
p_callBack = new JavaCallBackFun(env,callBackObj,callBackMethod,true);
}
//async call
p_sdk->requestAsync(methodNameStr,params,p_callBack);
env->ReleaseStringUTFChars(methodName,methodNameStr);
}

CommonSDK.java

 package com.pptv.sdk;
import java.util.Map; /**
* CommonSDK is a common interface to interact with sdk.so
* <p>
* CommonSDK use jni to call native method written by C++,and it
* provide a common interface for Java developer.You can directly
* call the common interface,but it is suggested to use the special
* interface based on CommonSDK,which is more understandable.
* @author guoxiaoqian
*/
public class CommonSDK implements SDKCallBack
{
static
{
System.loadLibrary("sdk");
} //Exception Call Back
@Override
public void callBack(String result)
{
// TODO Auto-generated method stub
System.out.println("Exception occured: "+result);
} private long m_sdkHandle;
private static final CommonSDK m_sdk = new CommonSDK(); private CommonSDK()
{
m_sdkHandle = initSDKNative(this,SDKCallBack.callBackName);
} /**
* getInstance() get a singleton CommonSDK object
* @return CommonSDK object
*/
public static CommonSDK getInstance()
{
return m_sdk;
} protected void finalize()
{
cleanSDKNative(m_sdkHandle);
} /**
* request() sync request
* @param methodName specify the method to call
* @param params multi params in key-value map
* @return json string containing complex result
*/
public String request(String methodName,Map<String,String> params)
{
String[] keyArr = new String[params.size()];
String[] valueArr = new String[params.size()];
int i=;
for(Map.Entry<String, String> entry:params.entrySet())
{
keyArr[i] = entry.getKey();
valueArr[i] = entry.getValue();
++i;
}
return requestNative(m_sdkHandle,methodName,keyArr,valueArr);
} /**
* requestAsync() async request
* @param methodName specify the method to call
* @param params multi params in key-value map
* @param callBackObj specify the obj to handle callback from sdk
*/
public void requestAsync(String methodName,Map<String,String> params,SDKCallBack callBackObj)
{
String[] keyArr = new String[params.size()];
String[] valueArr = new String[params.size()];
int i=;
for(Map.Entry<String, String> entry:params.entrySet())
{
keyArr[i] = entry.getKey();
valueArr[i] = entry.getValue();
++i;
}
requestAsyncNative(m_sdkHandle,methodName,keyArr,valueArr,callBackObj,callBackObj==null?null:SDKCallBack.callBackName);
} private native long initSDKNative(Object callBackObject,String exceptionFun);
private native void cleanSDKNative(long sdkHandle);
private native String requestNative(long sdkHandle,String methodName,String keys[],String values[]);
private native void requestAsyncNative(long sdkHandle,String methodName,String keys[],String values[],Object callBackObject,String callBackFunName); }

SDKCallBack.java

 package com.pptv.sdk;

 /**
* SDKCallBack is an interface that you must implements when
* you want to have an object to handle the callback form sdk.
* @author guoxiaoqian
*/
public interface SDKCallBack {
public final String callBackName = "callBack";
public abstract void callBack(String result);
}

JNI实现JAVA和C++互相调用的更多相关文章

  1. Android 通过 JNI 访问 Java 字段和方法调用

    在前面的两篇文章中,介绍了 Android 通过 JNI 进行基础类型.字符串和数组的相关操作,并描述了 Java 和 Native 在类型和签名之间的转换关系. 有了之前那些基础,就可以实现 Jav ...

  2. Android jni c/c++线程通过CallVoidMethod调用java函数出现奔溃问题

    最近在移植网络摄像机里的p2p库到android平台,需要用到jni,最近在c线程了调用java函数的时候 出现一个问题,假如在同一个线程调用java函数是没问题的,但在一个c线程了调用java函数就 ...

  3. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  4. 【我的Android进阶之旅】Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法

    错误描述 今天使用第三方的so库时候,调用JNI方法时出现了错误.报错如下所示: 11-01 16:39:20.979 4669-4669/com.netease.xtc.cloudmusic E/a ...

  5. JNI之JAVA调用C++接口

    1.JNI定义(来自百度百科) JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java1.1开始,Java Native Interface(JNI)标准成为ja ...

  6. 通过JNI实现java调用C代码和C代码调用java的代码

    一.java调用C代码 1)java中需要声明调用的函数,也就是native方法,并通过System.LoadLibrary来调用dll或者so(C代码).实例代码如下: public class H ...

  7. Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)

    转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930503.html Android JNI之JAVA与C++对象建立对称关联 1.JAVA对象持有C++对象 ...

  8. java本地方法如何调用其他程序函数,方法详解

    JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...

  9. android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...

随机推荐

  1. mysql innodb myisam 比较

    InnoDB: 支持事务处理等 不加锁读取 支持外键 支持行锁 不支持FULLTEXT类型的索引 不保存表的具体行数,扫描表来计算有多少行 DELETE 表时,是一行一行的删除 InnoDB 把数据和 ...

  2. 【探路者】互评beta版本

    成员博客 1蔺依铭:http://www.cnblogs.com/linym762/ 2张恩聚:http://www.cnblogs.com/zej87/ 3米赫:http://www.cnblogs ...

  3. 20172314 蓝墨云课堂实践ASL

    由于去跳啦啦操没有上课... 介绍 折半查找,又称作二分查找.这个查找的算法的特点,就是,要求数据要是有序的. 1 ,存储结构一定是顺序存储 2 ,关键字大小必须有序排列 然后,利用这组有序的数据之间 ...

  4. mysql 对表格加索引但原表格有重复数据

    1.把表中唯一数据搜索创建临时表,最后代替原先表. create table mmmmmm as SELECT * FROM meriadianannotation GROUP BY SeriesID ...

  5. 遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题的解决方法

    运行一个基于tensorflow的模型时,遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题. 解决方法:打开 ...

  6. html、JSP运行原理

    HTML运行原理 1.本地运行      所谓本地运行就是直接用 浏览器打开 2.远程访问的原理示意图: 何为协议?计算机互相通信(网络)的规则.常见的协议有 http .smtp. ftp.pop等 ...

  7. float精度丢失的问题

    在做IPTV的时候,遇到以下这个问题: 现有一个float型数据,以下代码打印输出: float n = 40272.48f; System.out.println(new Double(n * 10 ...

  8. String、StringBuilder与StringBuffer的区别

    1.String类是public.final修饰的. 在Java中,被final修饰的类是不允许被继承的,并且String它的成员方法都默认为final方法. 查看源码得知,String类其实是通过c ...

  9. CDN问题

    名称解释:正反向解析 主辅服务器 domain zone 记录:SOA.NS.A.CNAME.PRT.MX DNS配置文件中各字段作用,如TTL DNS端口号? TCP53和UDP53使用场合 Lin ...

  10. 关于解决java读取excel文件遇空行抛空指针的问题 !

    关于解决java读取excel文件遇空行抛空指针的问题 ! package exceRead; import java.io.File; import java.io.FileInputStream; ...