欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JNI 简单使用 (二)

程序员文章站 2022-06-06 20:38:12
...

上一篇简单讲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;  
}



运行结果截图:

JNI 简单使用 (二)

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

欢迎评论和讨论。

相关标签: jni