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 |