1、java 传入的String 在 C 中转化为 char*打印出来
jstring obj;
const char* string = (char*)(*env)->GetStringUTFChars(env,obj,NULL);
__android_log_print(ANDROID_LOG_INFO, "JNIMsg",string);
2、'for' loop initial declarations are only allowed in C99 mode 错误
int i = 0;
for (; i < size; i++) {}
需要把int i 定义在前面
3、取得数组中下标为 i 的元素
jobject obj= ((*env)->GetObjectArrayElement(env, array, i));
4、JNI定义字符串数组并给字符串数组赋值
jobjectArray arrays = 0;
//定义长度
jsize len = 20;
arrays = (*jniEnv)->NewObjectArray(jniEnv, len, (*jniEnv)->FindClass(
jniEnv, "java/lang/String"), 0);
jstring jstr;
char* sa[] = { "Hello,", "world!", "JNI", "很", "好玩" };
int i = 0;
for (; i < len; i++)
{
jstr = (*env)->NewStringUTF(env, sa[i]);
(*env)->SetObjectArrayElement(env, arrays, i, jstr);//必须放入jstring
}
5、获取数组的值
int k = 0;
for (; k < len; k++) {
jstring string = (jstring)((*jniEnv)->GetObjectArrayElement(jniEnv,
arrays, k));
if (string != NULL) {
char * c = (*jniEnv)->GetStringUTFChars(jniEnv, string, 0);
__android_log_print(ANDROID_LOG_INFO, "JNIMsg", c);
}
}
6、中间层数据类型转化
char* ---> jstring (*jniEnv)->NewStringUTF(jniEnv,char*)
jstring ---> char (*jniEnv)->GetStringUTFChars(jniEnv, jstring, 0);
long ---> char* ltoa(long,char*,10); sprintf(csendBodyLen,"%ld",sendBodyLen);
char* ---> long *long = atol(char*);
jni和java之间字符串的转换方法。
C的实现:
JNIEXPORTjstring JNICALL Java_Android123_CwjC (JNIEnv *env, jobject obj,jstring string)
{
charszBuffer[255];
return(*env)->NewStringUTF(env, szBuffer);
}
C++的实现:
JNIEXPORTjstring JNICALL Java_Android123_CwjCpp (JNIEnv *env, jobject obj,jstring string)
{
constchar *strUTF = env->GetStringUTFChars(string,0);
charszBuffer[255];
strcpy(szBuffer,strUTF);
env->ReleaseStringUTFChars(string,strUTF);
returnenv->NewStringUTF(szBuffer);
}
java中string与byte[]的转换
1.string 转 byte[]
byte[]midbytes=isoString.getBytes("UTF8");
//为UTF8编码
byte[]isoret = srt2.getBytes("ISO-8859-1");
//为ISO-8859-1编码
其中ISO-8859-1为单字节的编码
2.byte[]转string
StringisoString = new String(bytes,"ISO-8859-1");
Stringsrt2=new String(midbytes,"UTF-8");
//jbytearray转c++byte数组 | ||
jbyte * arrayBody =env->GetByteArrayElements(data,0); | ||
3 | jsize theArrayLengthJ = env->GetArrayLength(data); | |
4 | BYTE * starter = (BYTE *)arrayBody; |
1 | //jbyteArray 转 c++中的BYTE[] | |
2 | //jbytearray array |
3 | jbyte * olddata = (jbyte*)env->GetByteArrayElements(array,0); | |
4 | jsize |
5 | BYTE* bytearr = (BYTE*)olddata; | |
6 | int len = (int)oldsize; |
1 | //C++中的BYTE[]转jbyteArray | |
2 | //nOutSize是BYTE数组的长度BYTE pData[] |
3 | jbyte *by = (jbyte*)pData; | |
4 | jbyteArray jarray = env->NewByteArray(nOutSize); |
5 | env->SetByteArrayRegin(jarray, 0, nOutSize, by); |
1 | //jbyteArray 转 char * | |
2 | char* data = (char*)env->GetByteArrayElements(strIn,0); |
1 | //char* 转jstring | |
2 | jstring WindowsTojstring(JNIEnv* env, char* str_tmp) |
3 | { | |
4 | |
5 | | |
6 | |
7 | | |
8 | |
9 | | ||
10 | | ||
11 | | |
12 | |
13 | | |
14 | |
15 | | |
16 | |
17 | | |
18 | |
19 | | |
20 | |
21 | | |
22 | |
23 | | |
24 | |
25 | } |
1 | //jstring 转 char* 或者 constchar* | |
2 | // jstring str |
3 | const char *key = env->GetStringUTFChars(str, 0); | |
4 | //jboolean isOffer |
5 | jsClient->modify(key, isOffer); | |
6 | //需要释放,否则容易内存泄露 |
7 | env->ReleaseStringUTFChars(str, key); |
1 | //JNI 返回 jbyteArray | |
2 | JNIEXPORT jbyteArray JNICALL Java_Test_getByteArray(JNIEnv *env,jobject obj) |
3 | { | |
4 | |
5 | | |
6 | |
7 | | |
8 | |
9 | | ||
10 | | ||
11 | | |
12 | |
13 | | |||
14 | } | |||
1 | //jstring to char* | |||
2 | char* jstringTostring(JNIEnv* env, jstring jstr) | |
3 | { |
4 | | |
5 | |
6 | | |
7 | |
8 | | |
9 | |
10 | | |
11 | |
12 | | |
13 | |
14 | | |
15 | |
16 | | |
17 | |
18 | | |
19 | } |
1 | char* to jstring | |
2 | jstring stoJstring(JNIEnv* env, const char* pat) |
3 | { | |
4 | |
5 | | |
6 | |
7 | | |
8 | |
9 | | ||
10 | } | ||
1 | //将jstring类型转换成windows类型 | |
2 | char* jstringToWindows( JNIEnv *env, jstring jstr ) |
3 | { | |
4 | |
5 | | |
6 | |
7 | | |
8 | |
9 | | ||
10 | | ||
11 | | |
12 | |
13 | | |
14 | } |
1 | //将windows类型转换成jstring类型 | |
2 | jstring WindowsTojstring( JNIEnv* env, char* str ) |
3 | { | |
4 | |
5 | | |
6 | |
7 | | |
8 | |
9 | | ||
10 | | ||
11 | | |
12 | |
13 | |
14 | |
15 | | |
16 | |
17 | | |
18 | |
19 | } | |
20 | |
1 | //从传进来的对象中取出byte[] | |
2 | jfieldID byteData =(env)->GetFieldID(clazz,"bData","[B"); |
3 | jbyteArray pDataIn = (jbyteArray)(env)->GetObjectField(objDataIn, byteData); | |
4 | jsize theArrayLeng = env->GetArrayLength(pDataIn); |
1 | //byte[]转为BYTE[] | |
2 | jbyte * arrayBody =env->GetByteArrayElements(pDataIn,0); |
3 | BYTE * jDataIn = (BYTE *)arrayBody; |
1 | //将BYTE数组转为jarray | |
2 | jbyte* byte =(jbyte*)jDataOut; |
3 | jbyteArray jarray = env->NewByteArray(theArrayLeng); | |
4 | env->SetByteArrayRegion(jarray, 0, theArrayLeng,byte); |
1 | //给每一个实例的变量付值 | |
2 | (env)->SetObjectField(objDataIn,byteData,jarray); |
3 | (env)->SetIntField(objDataIn,pDataInLen,jDataInLen); | |
4 | (env)->ReleaseByteArrayElements |