jni 调用java base64,base64编码及JNI实现,base64编码非原创,只做JNI端处理

直接上代码:

#include

#include

#include

#include

#include "base64.h"

extern "C" {

//Base64 编码

int Base64Encode(unsigned char *OrgString, unsigned char *Base64String, int OrgStringLen) {

int Base64StringLen = 0;

static unsigned char Base64Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.@";

while (OrgStringLen > 0) {

*Base64String++ = Base64Encode[(OrgString[0] >> 2) & 0x3f];

if (OrgStringLen > 2) {

*Base64String++ = Base64Encode[((OrgString[0] & 3) << 4)

| (OrgString[1] >> 4)];

*Base64String++ = Base64Encode[((OrgString[1] & 0xF) << 2)

| (OrgString[2] >> 6)];

*Base64String++ = Base64Encode[OrgString[2] & 0x3F];

} else {

switch (OrgStringLen) {

case 1:

*Base64String++ = Base64Encode[(OrgString[0] & 3) << 4];

*Base64String++ = '_';

*Base64String++ = '_';

break;

case 2:

*Base64String++ = Base64Encode[((OrgString[0] & 3) << 4)

| (OrgString[1] >> 4)];

*Base64String++ = Base64Encode[((OrgString[1] & 0x0F) << 2)

| (OrgString[2] >> 6)];

*Base64String++ = '_';

break;

}

}

OrgString += 3;

OrgStringLen -= 3;

Base64StringLen += 4;

}

*Base64String = '\0';

return Base64StringLen;

}

//Base64 解码

char GetBase64Value(unsigned char ch) //得到编码值

{

if ((ch >= 'A') && (ch <= 'Z'))  // A ~ Z

return ch - 'A';

if ((ch >= 'a') && (ch <= 'z'))  // a ~ z

return ch - 'a' + 26;

if ((ch >= '0') && (ch <= '9'))  // 0 ~ 9

return ch - '0' + 52;

switch (ch)       // 其它字符

{

case '.':

return 62;

case '@':

return 63;

case '_':  //Base64 填充字符

return 0;

default:

return 0;

}

}

// 解码函数

int Base64Decode(unsigned char *OrgString, unsigned char *Base64String, int Base64StringLen,bool bForceDecode)  //解码函数

{

if (Base64StringLen % 4 && !bForceDecode)   //如果不是 4 的倍数,则 Base64 编码有问题

{

OrgString[0] = '\0';

return -1;

}

unsigned char Base64Encode[4];

int OrgStringLen = 0;

while (Base64StringLen > 2)  //当待解码个数不足3个时,将忽略它(强制解码时有效)

{

Base64Encode[0] = GetBase64Value(Base64String[0]);

Base64Encode[1] = GetBase64Value(Base64String[1]);

Base64Encode[2] = GetBase64Value(Base64String[2]);

Base64Encode[3] = GetBase64Value(Base64String[3]);

*OrgString++ = (Base64Encode[0] << 2) | (Base64Encode[1] >> 4);

*OrgString++ = (Base64Encode[1] << 4) | (Base64Encode[2] >> 2);

*OrgString++ = (Base64Encode[2] << 6) | (Base64Encode[3]);

Base64String += 4;

Base64StringLen -= 4;

OrgStringLen += 3;

}

return OrgStringLen;

}

//Base64 函数完毕

}

Jni交互代码

/*

* Class:     com_encrypt_EncryptActivity

* Method:    base64Encrypt

* Signature: (Ljava/lang/String;)Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com_encrypt_EncryptActivity_base64Encrypt(

JNIEnv *env, jobject, jstring str) {

//接收java端传过来的字符串变量,需要编码的字符串

const char *string;

//base64加密后字符串指针

unsigned char *base64String;

//接收java端字符串

string = env->GetStringUTFChars(str, 0);

//计算出字符串的长度

int len = strlen(string) + 1;

//为字符串分配空间,通常为4个字节一组,且加密后长度小于2倍的长度加4

base64String = new unsigned char[len * 2 + 4];

//进行base64编码

Base64Encode((unsigned char *) string, base64String, len);

__android_log_print(ANDROID_LOG_INFO, "[INFO][Base64Encyrpt]",

"hello, base64 encode \n%s", (char *) base64String);

//释放出从java端接收的字符串

env->ReleaseStringUTFChars(str, string);

//返回加密的字符串到java端

return env->NewStringUTF((char *) base64String);

}

/*

* Class:     com_encrypt_EncryptActivity

* Method:    base64Decrypt

* Signature: (Ljava/lang/String;)Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com_encrypt_EncryptActivity_base64Decrypt(

JNIEnv *env, jobject, jstring str) {

//base64解码后字符串指针

unsigned char *decodeStr;

//接收java端传过来的字符串变量

const char *datestring;

//接收java端字符串

datestring = env->GetStringUTFChars(str, 0);

//字符串的长度

int len = strlen(datestring) + 1;

//为字符串分配空间

decodeStr = new unsigned char[len];

//base64解码

Base64Decode(decodeStr, (unsigned char *) datestring, len, true);

__android_log_print(ANDROID_LOG_INFO, "[INFO][Base64Decyrpt]",

"hello, base64 decode \n%s!", decodeStr);

//释放出从java端接收的字符串

env->ReleaseStringUTFChars(str, datestring);

//返回解码的字符串到java端

return env->NewStringUTF((char *) decodeStr);

}

java端声明:

public native String base64Encrypt(String str);

public native String base64Decrypt(String str);

载入库:

static {

System.loadLibrary("生成的库名称");

}

文件下载

base64编码及JNI实现

(出处: IStudy)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值