Android JNI 数据类型转换

本文详细解析了Java类型与C++本地类型的转换方法,包括基本数据类型、字符串类型以及指针类型的互转,并提供了实际示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本数据类型转换

复制代码
Java类型      别名          C++本地类型        字节(bit)  
boolean      jboolean       unsigned  char    8, unsigned  
byte         jbyte          signed  char     8  
char         jchar          unsigned  short   16, unsigned  
short        jshort          short            16  
int          jint            long             32  
long         jlong          __int64          64  
float        jfloat          float             32  
double       jdouble         double            64   
复制代码


也就说基本数据类型就可以直接转换了 ,比较麻烦的是char * 和jstring类型的呼唤,查看jni.h 

可以知道有如下方法:

jstring 转 char *

 

  const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0);
   // 使用nativeString

   (*env)->ReleaseStringUTFChars(env, javaString, nativeString); 

 

char * 转 jstring  (未测试)

 

      jstring  jstr = (*env)->NewStringUTF(char *utf)  

 

     //  // 使用jstr

 

      (*env)->ReleaseStringUTFChars(env, jstr, utf); 

 

String 转 jstring

 

String str = "test";
jstring jstr= m_jEnv->NewStringUTF(str.utf8().data());

//删除java对象 jstr 

pEnv->DeleteLocalRef(jstr);  

 

 

static jstring stoJstring(JNIEnv* env, const char* pat)
{
       jclass strClass = (*env)->FindClass(env, "Ljava/lang/String;");
       jmethodID ctorID = (*env)->GetMethodID(env, strClass, "<init>", "([BLjava/lang/String;)V");
       jbyteArray bytes = (*env)->NewByteArray(env, strlen(pat));
       (*env)->SetByteArrayRegion(env, bytes, 0, strlen(pat), (jbyte*)pat);
       jstring encoding = (*env)->NewStringUTF(env, "utf-8"); 
       return (jstring)(*env)->NewObject(env, strClass, ctorID, bytes, encoding);
}

static char* jstringTostring(JNIEnv* env, jstring jstr)
{
       char* rtn = NULL;
       jclass clsstring = (*env)->FindClass(env, "java/lang/String");
       jstring strencode = (*env)->NewStringUTF(env, "utf-8");
       jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");
       jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid, strencode);
       jsize alen = (*env)->GetArrayLength(env, barr);
       jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);
       if (alen > 0)
       {
                 rtn = (char*)malloc(alen + 1);
                 memcpy(rtn, ba, alen);
                 rtn[alen] = 0;
       }
       (*env)->ReleaseByteArrayElements(env, barr, ba, 0);
       return rtn;
}  

 


 

很多方法可以参考jni.h 


 搜索到这个人的博客,总结的不错 

JNI的提高,Java类型和C(C++)类型转换源代码

http://blog.youkuaiyun.com/ostrichmyself/article/details/4557851 

 

JNI 的多线程

 http://blog.youkuaiyun.com/popop123/article/details/1511180


原文地址:

http://www.cnblogs.com/likwo/archive/2012/05/22/2512483.html


other-->


1、jstring --->char

JNIEXPORTjboolean JNICALL Java_gotsun_willom_composition_CompositionDecode_a

  (JNIEnv *env, jclass thiz,jstring name)  // 常用于传入中文路径等

{

  char *pack;

  pack=(char *)(*env)->GetStringUTFChars(env,name,JNI_FALSE);

  xxx

  (*env)->ReleaseStringUTFChars(env,name, pack);

}

2、jbyteArray-->char

JNIEXPORTvoid JNICALL Java_gs83168_decode_dictionary_DecodeDictionary_initialize

  (JNIEnv *env, jobject thiz, jbyteArray fPath)//常用语传入byte[]类型处理

{

  char *path = NULL;

  path = (char*)(*env)->GetByteArrayElements(env, fPath, 0);  // 得到路径

  intlength = (*env)->GetArrayLength(env, fPath);

  xxx

  (*env)->ReleaseByteArrayElements(env, fPath, path, 0);

}

3、*char ---àjbyteArray

JNIEXPORTjcharArray JNICALLJava_gs83168_decode_dictionary_DecodeDictionary_getUnicode

  (JNIEnv *env,jobjectthiz)  //常用于读取文件传到JAVA

{

  char *unicodeChar;

  static int charSize=100;

   unicodeChar=malloc(charSize);

  XXX  //赋值给unicodeChar

  jbyteArray array;

  array = (*env)->NewByteArray(env,charSize);  //开辟数组

  (*env)->SetByteArrayRegion(env, array, charSize,1,unicodeChar);

  return array;

}


4socket通讯

  structsockaddr_inclientAddr;  

  inthsocket = -1;

  structsockaddr_inserverAddr;

  socklen_tserverAddrLen

  bzero(&clientAddr,sizeof(clientAddr));

  clientAddr.sin_family = AF_INET;

  clientAddr.sin_addr.s_addr =htons(INADDR_ANY); // INADDR_ANY表示自动获取本机地址

  clientAddr.sin_port =htons(0); // 0表示让系统自动分配一个空闲端口

  hsocket =socket(AF_INET, SOCK_STREAM, 0);

  //LOGI("update - hsocket = 0x%x\n",hsocket);

  if(hsocket== -1)  return NULL;

  bind(hsocket,(structsockaddr*) &clientAddr,sizeof(clientAddr));

  bzero(&serverAddr,sizeof(serverAddr));

  serverAddr.sin_family = AF_INET;

  serverAddr.sin_addr.s_addr =htons(INADDR_ANY);

  serverAddr.sin_port =htons(10001);

  serverAddrLen =sizeof(serverAddr);

  connect(hsocket,(structsockaddr*)&serverAddr,sizeof(serverAddr));

  jbyteusrcmd[8]={1,1,1,1,1,1,1,1};   //发送数据

  intsendLen = send(hsocket,usrcmd,8, 0);

  jbyte buf[32];

  intlen =recv(hsocket,buf, 32, 0);  //等待接收数据

  if(hsocket != -1)  close(hsocket);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值