java string转换成char_java本地方法调用(JNI)的参考代码—-实现将String转换成char*,将char*转换成String. | 学步园...

首先建立Test.java,然后使用javac Test.java编译的到Test.class,然后再使用javah -jni Test得到Test.h,然后建立Test.c并且include “Test.h"并实现相应的本地方法。这些步骤做好之后使用如下命令将Test.c编译成动态链接库:

gcc -c Test.c

gcc -shared -fPCI -o libtest.so Test.o

注意:需要先将jni.h和jni_md.h拷贝到当前目录中,并且将jni.h中的改成"jni_md.h",将Test.h中的改为"jni_md.h"。

相关源代码如下:

/***********Test.java***************/

public class Test{

static{

System.loadLibrary("test");

}

public Test(){

System.out.println(getString());

String str="Hello,BBBBBBBBBBBBBBA";

showString(str);

}

public native String getString();

public native void showString(String str);

public static void main(String[] args){

new Test();

}

}

/***************Test.h****************/

/* DO NOT EDIT THIS FILE - it is machine generated */

#include "jni.h"

/* Header for class Test */

#ifndef _Included_Test

#define _Included_Test

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: Test

* Method: getString

* Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_Test_getString

(JNIEnv *, jobject);

/*

* Class: Test

* Method: showString

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

*/

JNIEXPORT void JNICALL Java_Test_showString

(JNIEnv *, jobject, jstring);

#ifdef __cplusplus

}

#endif

#endif

/************Test.c***************/

#include "Test.h"

#include

#include

#include

jstring CStr2Jstring( JNIEnv* env, const char* pat )

{

//定义java String类 strClass

jclass strClass = (*env)->FindClass(env,"Ljava/lang/String;");

//获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String

jmethodID ctorID = (*env)->GetMethodID(env,strClass, "", "([BLjava/lang/String;)V");

//建立byte数组

jbyteArray bytes = (*env)->NewByteArray(env,(jsize)strlen(pat));

//将char* 转换为byte数组

(*env)->SetByteArrayRegion(env,bytes, 0, (jsize)strlen(pat), (jbyte*)pat);

//设置String, 保存语言类型,用于byte数组转换至String时的参数

jstring encoding = (*env)->NewStringUTF(env,"GB2312");

//将byte数组转换为java String,并输出

return (jstring)(*env)->NewObject(env,strClass, ctorID, bytes, encoding);

}

char* Jstring2CStr(JNIEnv* env, jstring jstr)

{

char* rtn = NULL;

jclass clsstring = (*env)->FindClass(env,"java/lang/String");

jstring strencode = (*env)->NewStringUTF(env,"GB2312");

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); //new char[alen+1];

memcpy(rtn,ba,alen);

rtn[alen]=0;

}

(*env)->ReleaseByteArrayElements(env,barr,ba,0);

return rtn;

}

JNIEXPORT jstring JNICALL Java_Test_getString (JNIEnv *env, jobject obj){

char *mychar="Hello,AAAAAAAAAAAAAAAAAB";

return CStr2Jstring(env,mychar);

}

JNIEXPORT void JNICALL Java_Test_showString (JNIEnv *env, jobject obj, jstring str){

char *mychar=Jstring2CStr(env,str);

printf("-->%s

}

程序编译运行环境:

root@ubuntu:/home/kyc# javac -version

javac 1.6.0_27

root@ubuntu:/home/kyc# java -version

java version "1.6.0_27"

OpenJDK Runtime Environment (IcedTea6 1.12.3) (6b27-1.12.3-0ubuntu1~12.04)

OpenJDK Server VM (build 20.0-b12, mixed mode)

程序运行截图:

1364736885_6866.png

(--------------完----------------)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值