JNI各类型参数互相调用

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  oldsize =env->GetArrayLength(array);

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

    jstringrtn=0;

5

    intslen = (int)strlen(str_tmp);

6

    unsignedshort* buffer=0;

7

    if(slen== 0)

8

    {

9

        rtn= env->NewStringUTF(str_tmp);

10

    }





11

    else

12

    {

13

        intlength = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen,NULL, 0);

14

        buffer= (unsigned short*)malloc(length*2+1);

15

        if(MultiByteToWideChar(CP_ACP,0, (LPCSTR)str_tmp, slen, (LPWSTR)buffer, length) >0)

16

        {

17

            rtn= env->NewString((jchar*)buffer, length);

18

        }

19

    }

20

    if(buffer)

21

    {

22

        free(buffer);

23

    }

24

    returnrtn;

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

    jbyteArrayfirstMacArray = env->NewByteArray( 6 );

5

    ......

6

    jbyte*bytes = env->GetByteArrayElements( firstMacArray,0);

7

    for( int i = 0; i < sizeof( pAdapterInfo->Address ); i++ )

8

    {

9

       bytes[i ] = pAdapterInfo->Address[ i ];

10

    }





11

 

12

    env->SetByteArrayRegion(firstMacArray,0, 6, bytes );

13

    returnfirstMacArray;

14

}

1

//jstring to char*






2

char* jstringTostring(JNIEnv* env, jstring jstr)

3

      

4

    char*rtn = NULL;

5

    jclassclsstring = env->FindClass("java/lang/String");

6

    jstringstrencode = env->NewStringUTF("utf-8");

7

    jmethodIDmid = env->GetMethodID(clsstring, "getBytes","(Ljava/lang/String;)[B");

8

    jbyteArraybarr= (jbyteArray)env->CallObjectMethod(jstr, mid,strencode);

9

    jsizealen = env->GetArrayLength(barr);

10

    jbyte*ba = env->GetByteArrayElements(barr, JNI_FALSE);

11

    if(alen > 0)

12

    {

13

        rtn= (char*)malloc(alen + 1);

14

        memcpy(rtn,ba, alen);

15

        rtn[alen]= 0;

16

    }

17

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

18

    returnrtn;

19

}

 

1

char* to jstring

2

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

3

{

4

    jclassstrClass = env->FindClass("Ljava/lang/String;");

5

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

6

    jbyteArraybytes = env->NewByteArray(strlen(pat));

7

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

8

    jstringencoding = env->NewStringUTF("utf-8");

9

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

10

}





 

1

//将jstring类型转换成windows类型

2

char* jstringToWindows( JNIEnv *env, jstring jstr )

3

{

4

    intlength = (env)->GetStringLength(jstr );

5

    constjchar* jcstr = (env)->GetStringChars(jstr, 0 );

6

    char*rtn = (char*)malloc( length*2+1 );

7

    intsize = 0;

8

    size= WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length,rtn,(length*2+1), NULL, NULL );

9

    if(size <= 0 )

10

    returnNULL;





11

    (env)->ReleaseStringChars(jstr,jcstr );

12

    rtn[size]= 0;

13

    returnrtn;

14

}

 

1

//将windows类型转换成jstring类型

2

jstring WindowsTojstring( JNIEnv* env, char* str )

3

{

4

    jstringrtn = 0;

5

    intslen = strlen(str);

6

    unsignedshort * buffer = 0;

7

    if(slen == 0 )

8

        rtn= (env)->NewStringUTF(str );

9

    else

10

    {





11

        intlength = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0);

12

        buffer= (unsigned short *)malloc( length*2 + 1 );

13

        if(MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer,length ) >0 )

14

            rtn= (env)->NewString( (jchar*)buffer, length );

15

    }

16

    if(buffer )

17

        free(buffer );

18

    returnrtn;

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;

 JNI开发交流 C/C++,JAVA,android,linux/unix  QQ群:25093009

 

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(pDataIn, arrayBody,0);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值