cocos2dx jni交互 获取java函数返回的字符串
2017-01-17 12:41
751 查看
1:C++调用java的无返回值函数。
(1):首先在C++端声明如下函数: (此函数由C++端调用,然后在该函数中,调用java端代码)
(2):C++端实现函数
public static void writeApkToFile(String apkName,String fileInfo);
(3):Java端方法(Java端的类放在src/org/cocos2dx/cpp下面)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2:C++调用java的返回值字符串的函数。
(1):首先在C++端声明如下函数: (此函数由C++端调用,然后在该函数中,调用java端代码)
(2):C++端实现函数
CallStaticObjectMethod 调用java有返回值的方法
jstring转化为std::string
(3):Java端方法
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3:C++传递给java字符串,并且调用java的返回值字符串的函数。侧重内存释放
(1):首先在C++端声明如下函数: (此函数由C++端调用,然后在该函数中,调用java端代码)
jstr = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID,jsSrc);const char* str = t.env->GetStringUTFChars(jstr, NULL);std::string ret(str);//拷贝一份字符串,然后释放strt.env->ReleaseStringUTFChars(jstr, str);//释放strt.env->DeleteLocalRef(jsSrc);//释放jsSrct.env->DeleteLocalRef(jstr);//释放jstrreturn
ret;//jstring js_pkn = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);//std::string str_pkn = JniHelper::jstring2string(js_pkn); //t.env->Delete(str_pkn);//return str_pkn;}#else if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32return "win32 client
encrypt";#endif}
jstr = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID,jsSrc);const char* str = t.env->GetStringUTFChars(jstr, NULL);std::string ret(str);t.env->DeleteLocalRef(jsSrc);t.env->ReleaseStringUTFChars(jstr, str);t.env->DeleteLocalRef(jstr);return ret;}#else
if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32return "win32 client decrypt";#endif}
(2):Java端方法(Java端的类放在src/org/cocos2dx/cpp下面)
经测试,发现jni中,字符串需要自己手动释放。
1:自己从c++传给java的字符串
2:java返回的字符串
3:java返回之后转化为c的字符串
http://blog.csdn.net/tianxiawuzhei/article/details/44569061 http://blog.csdn.net/liuzhimayi/article/details/51504870
(1):首先在C++端声明如下函数: (此函数由C++端调用,然后在该函数中,调用java端代码)
//@param apkName 下载好之后,命名的apkName static void writeToSDCard(const char* apkName,const char* apkContent);
(2):C++端实现函数
"(Ljava/lang/String;Ljava/lang/String 4000 ;)V"为签名,代码2个string参数,无返回值
public static void writeApkToFile(String apkName,String fileInfo);
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)//头文件包含 #include <jni.h> #include <android/log.h> #include "platform/android/jni/JniHelper.h" #define CLASS_NAME "org/cocos2dx/cpp/OperateSDCard" //java端方法所在的类 #endif //public static void writeApkToFile(String apkName,String fileInfo){ void WriteApkToSDCard::writeToSDCard(const char* apkName, const char* apkContent) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) JniMethodInfo t; //把流内容写入文件 if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "writeApkToFile", "(Ljava/lang/String;Ljava/lang/String;)V")) { jstring jApkName = t.env->NewStringUTF(apkName); jstring jApkContent = t.env->NewStringUTF(apkContent); t.env->CallStaticVoidMethod(t.classID, t.methodID, jApkName,jApkContent); t.env->DeleteLocalRef(jApkName); t.env->DeleteLocalRef(jApkContent); } #endif }CallStaticVoidMethod代表调用java端,无返回值方法。
(3):Java端方法(Java端的类放在src/org/cocos2dx/cpp下面)
public static void writeApkToFile(String apkName,String fileInfo){ try { File file = new File(Environment.getExternalStorageDirectory(),apkName); //"123.txt" BufferedWriter bw = new BufferedWriter(new FileWriter(file, false)); String info = fileInfo;//"dear123"; //fileInfo bw.write(info); bw.flush(); System.out.println("写入完成"); } catch (Exception e) { e.printStackTrace(); } }
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2:C++调用java的返回值字符串的函数。
(1):首先在C++端声明如下函数: (此函数由C++端调用,然后在该函数中,调用java端代码)
//获取sdcard的路径 static std::string getSDCardPath();
(2):C++端实现函数
/* 参考链接 http://www.cocoachina.com/bbs/read.php?tid=234998 http://www.cnblogs.com/benxintuzi/p/4593137.html http://blog.csdn.net/lognic10/article/details/22828589 http://www.2cto.com/kf/201402/279085.html sdpath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/"; */ std::string WriteApkToSDCard::getSDCardPath() { #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) JniMethodInfo t; if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "getSdCardPath", "()Ljava/lang/String;")) { //获取java返回的字符串 jstring jstr = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID); const char* str= t.env->GetStringUTFChars(jstr, NULL); std::string ret(str);//把字符串拷贝一份,然后释放掉原字符串,防止内存泄露 t.env->ReleaseStringUTFChars(jstr, str);//str t.env->DeleteLocalRef(jstr);//释放jstr return ret; //jstring js_pkn = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID); //std::string str_pkn = JniHelper::jstring2string(js_pkn); //t.env->Delete(str_pkn); //return str_pkn; } #endif }
CallStaticObjectMethod 调用java有返回值的方法
jstring转化为std::string
jstring jstr = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID); const char* str= t.env->GetStringUTFChars(jstr, NULL); t.env->ReleaseStringUTFChars(jstr, str); t.env->DeleteLocalRef(jstr);
(3):Java端方法
/** *获取sd卡路径 * * @return */ public static String getSdCardPath() { /* String sdpath = "/storage/sdcard0/"; return sdpath;*/ boolean exist = isSdCardExist(); String sdpath = ""; if (exist) { ////sdpath = Environment.getExternalStorageDirectory().getPath() + "/"; sdpath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/"; Log.e("OperateSDCard.getSDcardPath normal", sdpath); } else { sdpath = "sdcard不存在"; Log.e("OperateSDCard.getSDcardPath error", sdpath); } return sdpath; }
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3:C++传递给java字符串,并且调用java的返回值字符串的函数。侧重内存释放
(1):首先在C++端声明如下函数: (此函数由C++端调用,然后在该函数中,调用java端代码)
#pragma once #ifndef __AESUtils_H_ #define __AESUtils_H_ #include <stdio.h> #include "cocos2d.h" USING_NS_CC; /* 加密 date : 2017.01.20 author : */ class AESUtils { public: //加密 static const char* encrypt(const char* sSrc); //解密 static const char* decrypt(const char* sSrc); }; #endif //__AESUtils_
#include "AESUtils.h" #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include <jni.h> #include <android/log.h> #include "platform/android/jni/JniHelper.h" #define CLASS_NAME "org/cocos2dx/cpp/AESUtil" #endif
std::string AESUtils::encrypt(const char* sSrc){#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)JniMethodInfo t;if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "encrypt", "(Ljava/lang/String;)Ljava/lang/String;")){jstring jsSrc = t.env->NewStringUTF(sSrc);//获取java返回的字符串jstring
jstr = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID,jsSrc);const char* str = t.env->GetStringUTFChars(jstr, NULL);std::string ret(str);//拷贝一份字符串,然后释放strt.env->ReleaseStringUTFChars(jstr, str);//释放strt.env->DeleteLocalRef(jsSrc);//释放jsSrct.env->DeleteLocalRef(jstr);//释放jstrreturn
ret;//jstring js_pkn = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);//std::string str_pkn = JniHelper::jstring2string(js_pkn); //t.env->Delete(str_pkn);//return str_pkn;}#else if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32return "win32 client
encrypt";#endif}
std::string AESUtils::decrypt(const char* sSrc){#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)JniMethodInfo t;if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "decrypt", "(Ljava/lang/String;)Ljava/lang/String;")){jstring jsSrc = t.env->NewStringUTF(sSrc);//获取java返回的字符串jstring
jstr = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID,jsSrc);const char* str = t.env->GetStringUTFChars(jstr, NULL);std::string ret(str);t.env->DeleteLocalRef(jsSrc);t.env->ReleaseStringUTFChars(jstr, str);t.env->DeleteLocalRef(jstr);return ret;}#else
if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32return "win32 client decrypt";#endif}
(2):Java端方法(Java端的类放在src/org/cocos2dx/cpp下面)
public static String encrypt(String sSrc) { return ""; }
经测试,发现jni中,字符串需要自己手动释放。
1:自己从c++传给java的字符串
2:java返回的字符串
3:java返回之后转化为c的字符串
http://blog.csdn.net/tianxiawuzhei/article/details/44569061 http://blog.csdn.net/liuzhimayi/article/details/51504870
相关文章推荐
- Cocos2dx 项目 C++ 通过Jni 调用Java获取字符串信息错乱
- cocos2dx3.3 android工程 Jni调用java函数
- 如果对象为空,java函数String.valueOf(Object obj)返回"null"字符串
- 关于cocos2dx如何通过jni进行c++与java的交互
- Android-java调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(二)
- dom4j来解析xml,通过URL获取服务器端返回的字符串,java swing 实现的页面
- JAVA 获取某个盘符下所有文件夹及其文件路径,并返回标准JSON字符串
- java执行cmd命令并获取返回结果字符串
- jni实现返回值为java类型的String[]和List<E>的函数
- android和cocos2dx c++工程交互(java和c++通过jni交互)
- jni java与c++交互返回三维数组jobjectArray
- 复习基础--JAVA多线程-获取函数返回结果
- Java精确截取字符串/获取字符串前指定长度字符函数
- phonegap js端调用Java端函数及获取返回参数
- 通过JNI实现C语言设置Java二维字符串数组并返回该字符串数组
- 利用java反射调用实现对字符串的解析,成功调入函数,并且返回值
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- ”黑马程序员“编写一个可以获取文件扩展名的函数,形参接收一个文件名字符串,返回一个扩展名字符串。