- 论坛徽章:
- 0
|
一。java中字符串的返回很容易,和其它如int类型没有什么区别,只是最后的时候需要做一下类型转换。
JNIEXPORT jstring JNICALL Java_stringTest_displayString (JNIEnv * env, jclass obj){
jstring jstr;
char str[]="Hello World\n";
jstr=env->NewStringUTF(str);
return jstr;
}
给出java和c类型对应关系,以及String转换函数
Java类型 本地类型 字节(bit)
boolean jboolean 8, unsigned
byte jbyte 8
char jchar 16, unsigned
short jshort 16
int jint 32
long jlong 64
float jfloat 32
double jdouble 64
void void n/a
访问String的一些方法:
◆GetStringUTFChars将jstring转换成为UTF-8格式的char*
◆GetStringChars将jstring转换成为Unicode格式的char*
◆ReleaseStringUTFChars释放指向UTF-8格式的char*的指针
◆ReleaseStringChars释放指向Unicode格式的char*的指针
◆NewStringUTF创建一个UTF-8格式的String对象
◆NewString创建一个Unicode格式的String对象
◆GetStringUTFLengt获取UTF-8格式的char*的长度
◆GetStringLength获取Unicode格式的char*的长度
二。普通类型数组的访问方法不难,略过。字符串数组的访问比较特殊,我们可以看到javah出来的.h文件中JNIEXPORT jobjectArray JNICALL Java_GetLocalMac_getMacs(JNIEnv*, jobject)中返回的是jobjectArray而不是jstringArray,即需要把这些访问按照Object的类型来访问。
//为数组分配空间
swArray = env->NewObjectArray(count,
env->FindClass("java/lang/String"),
env->NewStringUTF(""));
//SetObjectArrayElement刷新数组元素内容
for(i = 0; i SetObjectArrayElement(swArray, i, value) ;
这里用到的两个主要方法是:
GetObjectArrayElement returns the object element at a given index.
SetObjectArrayElement updates the object element at a given index.
三。需要说明的一点是,我所用的是c++,用的编程平台是VS.net2003,c++和c在JNI方面有一些差异。以SetObjectArrayElement为例
c的写法是,需要指定指针,并切将env做为第一参数 (*env)->SetObjectArrayElement(env, swArray, i, value)) ;
而c++的写法,可以明显看出两者的区别 env->SetObjectArrayElement(swArray, i, value) ;
四。其它关于普通类型数组的访问,java自定义类中方法的访问,以及异常等问题不再写了,其实是不会-_-,目前还没用到。
下面会再写一个本地程序访问java中的二维字符串数组的例子,原先在网上看到过一个,但是测试无法通过,自己修改了一下。
另外给出Core Java 2 Volume II-Advanced Features 5th Edition中关于JNI一章的内容,还有用到JNI可以去sun的网站上下载官方的JNI docs 和Tutorial,地址在我的链接里都有。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/22516/showart_161702.html |
|