SDK.h

  1. #ifndef SDK_H
  2. #define SDK_H
  3.  
  4. #include "AsyncProxy.h"
  5. #include "Module.h"
  6. #include <map>
  7. #include <vector>
  8. #include <string>
  9. using std::map;
  10. using std::vector;
  11. using std::string;
  12.  
  13. class SDK
  14. {
  15. private:
  16. vector<Module*> m_modules;
  17. AsyncProxy* mp_asyncProxy;
  18. map<string,Method*> m_methodIndex;
  19. private:
  20. Method* checkMethod(string methodName, map<std::string, std::string> &params);
  21. void init();
  22. public:
  23. SDK();
  24. SDK(CallBackFun* p_exceptionFun);
  25. ~SDK();
  26. void addModule(Module* p_module);
  27. string request(string methodName, map<string,string>& params);
  28. void requestAsync(string methodName, map<string, string> &params, CallBackFun* p_callBack = NULL);
  29. };
  30.  
  31. #endif

CallBackFun.h

  1. class CallBackFun
  2. {
  3. public:
  4. virtual ~CallBackFun(){}
  5. virtual void callBack(string& result){SDK_DEBUG("%s",result.c_str());}
  6. };

main.cpp

  1. #include <string.h>
  2. #include <jni.h>
  3. #include "core/SDK.h"
  4.  
  5. static JavaVM* p_vm = NULL;
  6.  
  7. JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
  8. {
  9. p_vm = vm;
  10. return JNI_VERSION_1_6;
  11. }
  12.  
  13. class JavaCallBackFun:public CallBackFun
  14. {
  15. private:
  16. jobject m_object;
  17. jstring m_method;
  18. static const char* m_signature;
  19. bool m_destroy;
  20. public:
  21. JavaCallBackFun( JNIEnv* env,jobject object,jstring method,bool destroy)
  22. {
  23. m_object = env->NewGlobalRef(object);
  24. m_method = (jstring)env->NewGlobalRef(method);
  25. m_destroy = destroy;
  26. }
  27.  
  28. ~JavaCallBackFun()
  29. {
  30. if(m_destroy == false)
  31. {
  32. JNIEnv* env;
  33. p_vm->AttachCurrentThread(&env, NULL);
  34. env->DeleteGlobalRef(m_object);
  35. env->DeleteGlobalRef(m_method);
  36. }
  37. }
  38.  
  39. void callBack(string& result)
  40. {
  41. JNIEnv* env;
  42. p_vm->AttachCurrentThread(&env, NULL);
  43. jstring jresult = env->NewStringUTF(result.c_str());
  44. const char* methodStr = env->GetStringUTFChars(m_method, );
  45. jclass clazz = env->GetObjectClass(m_object);
  46. jmethodID methodID = env -> GetMethodID(clazz,methodStr,m_signature);
  47. env -> CallVoidMethod(m_object,methodID,jresult);
  48. env -> ReleaseStringUTFChars(m_method,methodStr);
  49. if(m_destroy == true)
  50. {
  51. env->DeleteGlobalRef(m_object);
  52. env->DeleteGlobalRef(m_method);
  53. }
  54. }
  55. };
  56. const char* JavaCallBackFun::m_signature = "(Ljava/lang/String;)V";
  57.  
  58. extern "C" {
  59. JNIEXPORT jlong JNICALL Java_com_pptv_sdk_CommonSDK_initSDKNative( JNIEnv* env,jobject thiz,jobject callBackObj,jstring exceptionFun);
  60. JNIEXPORT void JNICALL Java_com_pptv_sdk_CommonSDK_cleanSDKNative( JNIEnv* env,jobject thiz,jlong sdkptr);
  61. JNIEXPORT jstring JNICALL Java_com_pptv_sdk_CommonSDK_requestNative( JNIEnv* env,jobject thiz,jlong sdkptr,jstring methodName,\
  62. jobjectArray paramKeys,jobjectArray paramValues);
  63. JNIEXPORT void JNICALL Java_com_pptv_sdk_CommonSDK_requestAsyncNative( JNIEnv* env,jobject thiz,jlong sdkptr,jstring methodName,\
  64. jobjectArray paramKeys,jobjectArray paramValues,jobject callBackObj,jstring callBackMethod);
  65. };
  66.  
  67. JNIEXPORT jlong JNICALL Java_com_pptv_sdk_CommonSDK_initSDKNative( JNIEnv* env,jobject thiz,jobject callBackObj,jstring exceptionFun)
  68. {
  69. JavaCallBackFun* p_callBack = new JavaCallBackFun(env,callBackObj,exceptionFun,false);
  70. return (jlong)new SDK(p_callBack);
  71. }
  72.  
  73. JNIEXPORT void JNICALL Java_com_pptv_sdk_CommonSDK_cleanSDKNative( JNIEnv* env,jobject thiz,jlong sdkptr)
  74. {
  75. SDK* p_sdk = (SDK*)sdkptr;
  76. delete p_sdk;
  77. }
  78.  
  79. JNIEXPORT jstring JNICALL Java_com_pptv_sdk_CommonSDK_requestNative( JNIEnv* env,jobject thiz,jlong sdkptr,jstring methodName,\
  80. jobjectArray paramKeys,jobjectArray paramValues)
  81. {
  82. SDK* p_sdk = (SDK*)sdkptr;
  83. const char * methodNameStr = env->GetStringUTFChars( methodName, );
  84. //init param map
  85. jstring jkey,jvalue;
  86. jsize keysLen=env->GetArrayLength(paramKeys);
  87. map<string,string> params;
  88. for(jsize i=;i<keysLen;++i)
  89. {
  90. jkey = (jstring)(env->GetObjectArrayElement(paramKeys,i));
  91. jvalue = (jstring)(env->GetObjectArrayElement(paramValues,i));
  92. const char *key = env->GetStringUTFChars(jkey, );
  93. const char *value = env->GetStringUTFChars(jvalue,);
  94. params[string(key)] = string(value);
  95. env->ReleaseStringUTFChars(jkey,key);
  96. env->ReleaseStringUTFChars(jvalue,value);
  97. }
  98.  
  99. string result = p_sdk->request(methodNameStr,params);
  100. env->ReleaseStringUTFChars(methodName,methodNameStr);
  101. return env->NewStringUTF(result.c_str());
  102. }
  103.  
  104. JNIEXPORT void JNICALL Java_com_pptv_sdk_CommonSDK_requestAsyncNative( JNIEnv* env,jobject thiz,jlong sdkptr,jstring methodName,\
  105. jobjectArray paramKeys,jobjectArray paramValues,jobject callBackObj,jstring callBackMethod)
  106. {
  107. SDK* p_sdk = (SDK*)sdkptr;
  108. const char * methodNameStr = env->GetStringUTFChars(methodName, );
  109. //init param map
  110. jstring jkey,jvalue;
  111. jsize keysLen=env->GetArrayLength(paramKeys);
  112. map<string,string> params;
  113. for(jsize i=;i<keysLen;++i)
  114. {
  115. jkey = (jstring)(env->GetObjectArrayElement(paramKeys,i));
  116. jvalue = (jstring)(env->GetObjectArrayElement(paramValues,i));
  117. const char *key = env->GetStringUTFChars(jkey, );
  118. const char *value = env->GetStringUTFChars(jvalue,);
  119. params[string(key)] = string(value);
  120. env->ReleaseStringUTFChars(jkey,key);
  121. env->ReleaseStringUTFChars(jvalue,value);
  122. }
  123. //init callback fun
  124. JavaCallBackFun* p_callBack = NULL;
  125. if(callBackObj != NULL && callBackMethod != NULL)
  126. {
  127. p_callBack = new JavaCallBackFun(env,callBackObj,callBackMethod,true);
  128. }
  129. //async call
  130. p_sdk->requestAsync(methodNameStr,params,p_callBack);
  131. env->ReleaseStringUTFChars(methodName,methodNameStr);
  132. }

CommonSDK.java

  1. package com.pptv.sdk;
  2. import java.util.Map;
  3.  
  4. /**
  5. * CommonSDK is a common interface to interact with sdk.so
  6. * <p>
  7. * CommonSDK use jni to call native method written by C++,and it
  8. * provide a common interface for Java developer.You can directly
  9. * call the common interface,but it is suggested to use the special
  10. * interface based on CommonSDK,which is more understandable.
  11. * @author guoxiaoqian
  12. */
  13. public class CommonSDK implements SDKCallBack
  14. {
  15. static
  16. {
  17. System.loadLibrary("sdk");
  18. }
  19.  
  20. //Exception Call Back
  21. @Override
  22. public void callBack(String result)
  23. {
  24. // TODO Auto-generated method stub
  25. System.out.println("Exception occured: "+result);
  26. }
  27.  
  28. private long m_sdkHandle;
  29. private static final CommonSDK m_sdk = new CommonSDK();
  30.  
  31. private CommonSDK()
  32. {
  33. m_sdkHandle = initSDKNative(this,SDKCallBack.callBackName);
  34. }
  35.  
  36. /**
  37. * getInstance() get a singleton CommonSDK object
  38. * @return CommonSDK object
  39. */
  40. public static CommonSDK getInstance()
  41. {
  42. return m_sdk;
  43. }
  44.  
  45. protected void finalize()
  46. {
  47. cleanSDKNative(m_sdkHandle);
  48. }
  49.  
  50. /**
  51. * request() sync request
  52. * @param methodName specify the method to call
  53. * @param params multi params in key-value map
  54. * @return json string containing complex result
  55. */
  56. public String request(String methodName,Map<String,String> params)
  57. {
  58. String[] keyArr = new String[params.size()];
  59. String[] valueArr = new String[params.size()];
  60. int i=;
  61. for(Map.Entry<String, String> entry:params.entrySet())
  62. {
  63. keyArr[i] = entry.getKey();
  64. valueArr[i] = entry.getValue();
  65. ++i;
  66. }
  67. return requestNative(m_sdkHandle,methodName,keyArr,valueArr);
  68. }
  69.  
  70. /**
  71. * requestAsync() async request
  72. * @param methodName specify the method to call
  73. * @param params multi params in key-value map
  74. * @param callBackObj specify the obj to handle callback from sdk
  75. */
  76. public void requestAsync(String methodName,Map<String,String> params,SDKCallBack callBackObj)
  77. {
  78. String[] keyArr = new String[params.size()];
  79. String[] valueArr = new String[params.size()];
  80. int i=;
  81. for(Map.Entry<String, String> entry:params.entrySet())
  82. {
  83. keyArr[i] = entry.getKey();
  84. valueArr[i] = entry.getValue();
  85. ++i;
  86. }
  87. requestAsyncNative(m_sdkHandle,methodName,keyArr,valueArr,callBackObj,callBackObj==null?null:SDKCallBack.callBackName);
  88. }
  89.  
  90. private native long initSDKNative(Object callBackObject,String exceptionFun);
  91. private native void cleanSDKNative(long sdkHandle);
  92. private native String requestNative(long sdkHandle,String methodName,String keys[],String values[]);
  93. private native void requestAsyncNative(long sdkHandle,String methodName,String keys[],String values[],Object callBackObject,String callBackFunName);
  94.  
  95. }

SDKCallBack.java

  1. package com.pptv.sdk;
  2.  
  3. /**
  4. * SDKCallBack is an interface that you must implements when
  5. * you want to have an object to handle the callback form sdk.
  6. * @author guoxiaoqian
  7. */
  8. public interface SDKCallBack {
  9. public final String callBackName = "callBack";
  10. public abstract void callBack(String result);
  11. }

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. 使用 MPI for Python 并行化遗传算法

    前言 本文中作者使用MPI的Python接口mpi4py来将自己的遗传算法框架GAFT进行多进程并行加速.并对加速效果进行了简单测试. 项目链接: GitHub: https://github.com ...

  2. app开发相关

    app播放UIWebview 没有声音解决: 设置 allowsInlineMediaPlayback  = YES; mediaPlaybackRequiresUserAction = NO

  3. 第一次作业(homework-01)成绩公布

    已收到博客名.github名的同学得分列表: 学号后三位 成绩(0-10) 215 8082 0132 5184 5027 7194 9.5157 7074 8195 6222 8158 6128 8 ...

  4. [转]有道云笔记markdown

    作为半个文字工作者,一天当中,一半时间用在遣词造句,一半时间则在死磕排版.当听说“前所未有的极简语法”Markdown,不仅能简化排版.大大提高书写效率,而且上手零门槛.好奇宝宝怎么忍得住一颗蠢蠢欲动 ...

  5. MacOS下安装BeautifulSoup库及使用

    BeautifulSoup简介 BeautifulSoup库是一个强大的python第三方库,它可以解析html进行解析,并提取信息. 安装BeautifulSoup 打开终端,输入命令: pip3 ...

  6. JavaWeb应用的生命周期

    JavaWeb应用的生命周期是由Servlet容器来控制. 启动阶段 (1)读取web.xml配置文件数据 (2)为JavaWeb应用创建一个ServletContext对象 (3)对所有的Filte ...

  7. JAVA方法的重载(overload)和覆盖(override)

    方法的重载(overload)和覆盖(override) 有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数.例如我们最常用的System.out.println() ...

  8. SQL之case when then用法详解

    case具有两种格式.简单case函数和case搜索函数. <span style="font-size:14px;">--简单case函数 case sex when ...

  9. 软工网络15团队作业4-DAY7

    每日例会 昨天的工作. 张陈东芳:sql连接的基本完成,尝试被其他类调用,未导入全部商品信息: 吴敏烽:基本完成商品信息的调用: 周汉麟:设定商品的调用规则: 林振斌:设计缓存区代码,用于存取最近浏览 ...

  10. postman 断言学习

    请求 url :https://www.v2ex.com/api/nodes/show.json?name=python get请求 postman发起请求并做断言 断言: tests["B ...