JNI 简单使用 (二)

上一篇简单讲java和c简单交互,这一篇讲数据(字符串)的交互。
内容来源于网友内容和自己总结。

java代码: 返回值String

package testbasic;

public class HelloWorld2 {

    public native String displayHelloWorld(String key, String value);
    static {
        System.loadLibrary("HelloWorld2");
    }
    public static void main(String[] args) {
        System.out.println("the String return by C is "+new HelloWorld2().displayHelloWorld("www.baidu.com", "百度"));  
    }
}

c代码:


  #include "stdafx.h"

#include "jni.h"
#include "testbasic_HelloWorld2.h"
#include <stdio.h>   
#include <windows.h>   
#include <iostream>
using namespace std; 


//接收java传过来的参数 在c中处理
char* javatoc( JNIEnv *env, jstring jstr )  
{  
  int length = env->GetStringLength(jstr);  
  const jchar* jcstr = env->GetStringChars(jstr, 0);  
  char* rtn = (char*)malloc(length*2+1);  
  int size = 0;  
  size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL);  
  if( size <= 0 )  
    return NULL;  
  env->ReleaseStringChars(jstr, jcstr);  
  rtn[size] = 0;  
  return rtn;  
} 

//将c中的参数进行处理,return到java端
jstring ctojava( JNIEnv *env, const char* str )  
{  
  jstring rtn = 0;  
  int slen = strlen(str);  
  unsigned short* buffer = 0;  
  if( slen == 0 )  
    rtn = env->NewStringUTF(str);   
  else  
  {  
    int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str, slen, NULL, 0);  
    buffer = (unsigned short*)malloc(length*2 + 1);  
    if( MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length) >0)  
      rtn = env->NewString((jchar*)buffer, length);  
  }  
  if(buffer)  
  free(buffer);  
  return rtn;  
}  


JNIEXPORT jstring JNICALL
Java_testbasic_HelloWorld2_displayHelloWorld(JNIEnv *env, jobject obj, jstring key, jstring value)
{
    printf("Helloworld2!\n");

    char * strMsgPtr = javatoc( env, key ); 
    printf("strMsgPtr: %s\n", (char*)strMsgPtr);

    char * strMsgPtr2 = javatoc( env, value ); 
    printf("strMsgPtr2: %s\n", (char*)strMsgPtr2); //这种方式乱码  

    const char *c_str = NULL;
    c_str = env ->GetStringUTFChars(value, NULL);//这种最简单的方式倒是可以   
    printf("c_str: %s\n", c_str);   //会在eclipse控制台输出百度

    env ->ReleaseStringUTFChars(value, c_str); 
    printf("c_str: %s\n", c_str);  //释放之后,输出就变成了\

    jstring tostring;  
    tostring = ctojava(env,strMsgPtr2);  
    return tostring;  
}



运行结果截图:

这里写图片描述

本次遇到的问题主要是 乱码和不输出(输出为\)的问题。
乱码的话,直接使用GetStringUTFChars处理;
不输出的问题是因为释放了,在释放之前输出/做处理就好了。

欢迎评论和讨论。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值