JNI实现JAVA和C++互相调用
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> ¶ms);
- 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> ¶ms, 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++互相调用的更多相关文章
- Android 通过 JNI 访问 Java 字段和方法调用
在前面的两篇文章中,介绍了 Android 通过 JNI 进行基础类型.字符串和数组的相关操作,并描述了 Java 和 Native 在类型和签名之间的转换关系. 有了之前那些基础,就可以实现 Jav ...
- Android jni c/c++线程通过CallVoidMethod调用java函数出现奔溃问题
最近在移植网络摄像机里的p2p库到android平台,需要用到jni,最近在c线程了调用java函数的时候 出现一个问题,假如在同一个线程调用java函数是没问题的,但在一个c线程了调用java函数就 ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- 【我的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 ...
- JNI之JAVA调用C++接口
1.JNI定义(来自百度百科) JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java1.1开始,Java Native Interface(JNI)标准成为ja ...
- 通过JNI实现java调用C代码和C代码调用java的代码
一.java调用C代码 1)java中需要声明调用的函数,也就是native方法,并通过System.LoadLibrary来调用dll或者so(C代码).实例代码如下: public class H ...
- Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)
转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930503.html Android JNI之JAVA与C++对象建立对称关联 1.JAVA对象持有C++对象 ...
- java本地方法如何调用其他程序函数,方法详解
JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...
- android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )
JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...
随机推荐
- 使用 MPI for Python 并行化遗传算法
前言 本文中作者使用MPI的Python接口mpi4py来将自己的遗传算法框架GAFT进行多进程并行加速.并对加速效果进行了简单测试. 项目链接: GitHub: https://github.com ...
- app开发相关
app播放UIWebview 没有声音解决: 设置 allowsInlineMediaPlayback = YES; mediaPlaybackRequiresUserAction = NO
- 第一次作业(homework-01)成绩公布
已收到博客名.github名的同学得分列表: 学号后三位 成绩(0-10) 215 8082 0132 5184 5027 7194 9.5157 7074 8195 6222 8158 6128 8 ...
- [转]有道云笔记markdown
作为半个文字工作者,一天当中,一半时间用在遣词造句,一半时间则在死磕排版.当听说“前所未有的极简语法”Markdown,不仅能简化排版.大大提高书写效率,而且上手零门槛.好奇宝宝怎么忍得住一颗蠢蠢欲动 ...
- MacOS下安装BeautifulSoup库及使用
BeautifulSoup简介 BeautifulSoup库是一个强大的python第三方库,它可以解析html进行解析,并提取信息. 安装BeautifulSoup 打开终端,输入命令: pip3 ...
- JavaWeb应用的生命周期
JavaWeb应用的生命周期是由Servlet容器来控制. 启动阶段 (1)读取web.xml配置文件数据 (2)为JavaWeb应用创建一个ServletContext对象 (3)对所有的Filte ...
- JAVA方法的重载(overload)和覆盖(override)
方法的重载(overload)和覆盖(override) 有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数.例如我们最常用的System.out.println() ...
- SQL之case when then用法详解
case具有两种格式.简单case函数和case搜索函数. <span style="font-size:14px;">--简单case函数 case sex when ...
- 软工网络15团队作业4-DAY7
每日例会 昨天的工作. 张陈东芳:sql连接的基本完成,尝试被其他类调用,未导入全部商品信息: 吴敏烽:基本完成商品信息的调用: 周汉麟:设定商品的调用规则: 林振斌:设计缓存区代码,用于存取最近浏览 ...
- postman 断言学习
请求 url :https://www.v2ex.com/api/nodes/show.json?name=python get请求 postman发起请求并做断言 断言: tests["B ...