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;
}
运行结果截图:
本次遇到的问题主要是 乱码和不输出(输出为\)的问题。
乱码的话,直接使用GetStringUTFChars处理;
不输出的问题是因为释放了,在释放之前输出/做处理就好了。
欢迎评论和讨论。
上一篇: 堆排序算法详解、及Java实现
下一篇: UVA 10791