首页 / JAVA / JNI实现JAVA和C++互相调用
JNI实现JAVA和C++互相调用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JNI实现JAVA和C++互相调用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8717字,纯文字阅读大概需要13分钟。
内容图文
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> 9using std::map; 10using std::vector; 11using std::string; 121314class SDK 15{ 16private: 17 vector<Module*> m_modules; 18 AsyncProxy* mp_asyncProxy; 19 map<string,Method*> m_methodIndex; 20private: 21 Method* checkMethod(string methodName, map<std::string, std::string> ¶ms); 22void init(); 23public: 24 SDK(); 25 SDK(CallBackFun* p_exceptionFun); 26 ~SDK(); 27void addModule(Module* p_module); 28string request(string methodName, map<string,string>& params); 29void requestAsync(string methodName, map<string, string> ¶ms, CallBackFun* p_callBack = NULL); 30}; 3132#endif
CallBackFun.h
1 class CallBackFun 2 { 3 public : 4 virtual ~CallBackFun(){} 5virtualvoid callBack(string& result){SDK_DEBUG("%s",result.c_str());} 6 };
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; staticconstchar* 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()); constchar* methodStr = env->GetStringUTFChars(m_method, 0); 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); } } }; constchar* 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; constchar * methodNameStr = env->GetStringUTFChars( methodName, 0); //init param map jstring jkey,jvalue; jsize keysLen=env->GetArrayLength(paramKeys); map<string,string> params; for(jsize i=0;i<keysLen;++i) { jkey = (jstring)(env->GetObjectArrayElement(paramKeys,i)); jvalue = (jstring)(env->GetObjectArrayElement(paramValues,i)); constchar *key = env->GetStringUTFChars(jkey, 0); constchar *value = env->GetStringUTFChars(jvalue,0); 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; constchar * methodNameStr = env->GetStringUTFChars(methodName, 0); //init param map jstring jkey,jvalue; jsize keysLen=env->GetArrayLength(paramKeys); map<string,string> params; for(jsize i=0;i<keysLen;++i) { jkey = (jstring)(env->GetObjectArrayElement(paramKeys,i)); jvalue = (jstring)(env->GetObjectArrayElement(paramValues,i)); constchar *key = env->GetStringUTFChars(jkey, 0); constchar *value = env->GetStringUTFChars(jvalue,0); 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
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 } 1920//Exception Call Back21 @Override 22publicvoid callBack(String result) 23 { 24// TODO Auto-generated method stub25 System.out.println("Exception occured: "+result); 26 } 2728privatelong m_sdkHandle; 29privatestatic final CommonSDK m_sdk = new CommonSDK(); 3031private CommonSDK() 32 { 33 m_sdkHandle = initSDKNative(this,SDKCallBack.callBackName); 34 } 353637/** 38 * getInstance() get a singleton CommonSDK object 39 * @return CommonSDK object 40*/41publicstatic CommonSDK getInstance() 42 { 43return m_sdk; 44 } 4546protectedvoid finalize() 47 { 48 cleanSDKNative(m_sdkHandle); 49 } 5051/** 52 * request() sync request 53 * @param methodName specify the method to call 54 * @param params multi params in key-value map 55 * @return json string containing complex result 56*/57public String request(String methodName,Map<String,String> params) 58 { 59 String[] keyArr = new String[params.size()]; 60 String[] valueArr = new String[params.size()]; 61int i=0; 62for(Map.Entry<String, String> entry:params.entrySet()) 63 { 64 keyArr[i] = entry.getKey(); 65 valueArr[i] = entry.getValue(); 66 ++i; 67 } 68return requestNative(m_sdkHandle,methodName,keyArr,valueArr); 69 } 7071/** 72 * requestAsync() async request 73 * @param methodName specify the method to call 74 * @param params multi params in key-value map 75 * @param callBackObj specify the obj to handle callback from sdk 76*/77publicvoid requestAsync(String methodName,Map<String,String> params,SDKCallBack callBackObj) 78 { 79 String[] keyArr = new String[params.size()]; 80 String[] valueArr = new String[params.size()]; 81int i=0; 82for(Map.Entry<String, String> entry:params.entrySet()) 83 { 84 keyArr[i] = entry.getKey(); 85 valueArr[i] = entry.getValue(); 86 ++i; 87 } 88 requestAsyncNative(m_sdkHandle,methodName,keyArr,valueArr,callBackObj,callBackObj==null?null:SDKCallBack.callBackName); 89 } 9091private native long initSDKNative(Object callBackObject,String exceptionFun); 92private native void cleanSDKNative(long sdkHandle); 93private native String requestNative(long sdkHandle,String methodName,String keys[],String values[]); 94private native void requestAsyncNative(long sdkHandle,String methodName,String keys[],String values[],Object callBackObject,String callBackFunName); 9596 }
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"; 10publicabstractvoid callBack(String result); 11 }
原文:http://www.cnblogs.com/guoxiaoqian/p/3915429.html
内容总结
以上是互联网集市为您收集整理的JNI实现JAVA和C++互相调用全部内容,希望文章能够帮你解决JNI实现JAVA和C++互相调用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。