大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Android技巧 > Java与C语言之间简单数据的传递

Java与C语言之间简单数据的传递(1)

关键词:JavaC语言  阅读(1145) 赞(14)

[摘要]本文是对Android技术10:Java与C语言之间简单数据的传递的讲解,对学习Android编程技术有所帮助,与大家分享。

由于C语言和Java语言之间很多类型不一致性,因此使用native时,需要数据类型转换。下面演示分别传递整型,字符串,整型数组,Java静态方法传递数据。

1.创建native方法

我们单独创建一个NativeClass类来存放native方法

 package com.forsta.ndk;
 
 public class NativeClass {
     public native int add(int x,int y);
     public native String showString(String str);
     public native int[] array(int [] a);
     public static native int sub(int x,int y);
 }

2.得到对应的头文件

通过在相应的目录下,使用javah com.forsta.ndk.Native,获得com_forsta_ndk_NativeClass.h

 /* DO NOT EDIT THIS FILE - it is machine generated */
 #include <jni.h>
 /* Header for class com_forsta_ndk_NativeClass */
 
 #ifndef _Included_com_forsta_ndk_NativeClass
 #define _Included_com_forsta_ndk_NativeClass
 #ifdef __cplusplus
 extern "C" {
 #endif
 /*
  * Class:     com_forsta_ndk_NativeClass
  * Method:    add
  * Signature: (II)I
  */
 JNIEXPORT jint JNICALL Java_com_forsta_ndk_NativeClass_add
   (JNIEnv *, jobject, jint, jint);
 
 /*
  * Class:     com_forsta_ndk_NativeClass
  * Method:    showString
  * Signature: (Ljava/lang/String;)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL Java_com_forsta_ndk_NativeClass_showString
   (JNIEnv *, jobject, jstring);
 
 /*
  * Class:     com_forsta_ndk_NativeClass
  * Method:    array
  * Signature: ([I)[I
  */
 JNIEXPORT jintArray JNICALL Java_com_forsta_ndk_NativeClass_array
   (JNIEnv *, jobject, jintArray);
 
 /*
  * Class:     com_forsta_ndk_NativeClass
  * Method:    sub
  * Signature: (II)I
  */
 JNIEXPORT jint JNICALL Java_com_forsta_ndk_NativeClass_sub
   (JNIEnv *, jclass, jint, jint);
 
 #ifdef __cplusplus
 }
 #endif
 #endif

3.实现头文件中方法

 #include <stdio.h>
 #include <jni.h>
 #include<malloc.h>
 #include "com_forsta_ndk_NativeClass.h"
 
 
 /**
  * 返回值 char* 这个代表char数组的首地址
  *  Jstring2CStr 把java中的jstring的类型转化成一个c语言中的char 字符串
  */
 char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr)
 {
      char*   rtn   =   NULL;
      jclass   clsstring   =   (*env)->FindClass(env,"java/lang/String"); //String
      jstring   strencode   =   (*env)->NewStringUTF(env,"GB2312");  // 得到一个java字符串 "GB2312"
      jmethodID   mid   =   (*env)->GetMethodID(env,clsstring,   "getBytes",   "(Ljava/lang/String;)[B"); //[ String.getBytes("gb2312");
      jbyteArray   barr=   (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
      jsize   alen   =   (*env)->GetArrayLength(env,barr); // byte数组的长度
      jbyte*   ba   =   (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
      if(alen   >   0)
      {
       rtn   =   (char*)malloc(alen+1);         //"\0"
       memcpy(rtn,ba,alen);
       rtn[alen]=0;
      }
      (*env)->ReleaseByteArrayElements(env,barr,ba,0);  //
      return rtn;
 }
 
 JNIEXPORT jint JNICALL Java_com_forsta_ndk_NativeClass_add
   (JNIEnv *env, jobject obj, jint x, jint y){
     return x+y;
 }
 
 JNIEXPORT jstring JNICALL Java_com_forsta_ndk_NativeClass_showString
   (JNIEnv *env, jobject obj, jstring str){
     //c语言中没有String类型
     char* s=Jstring2CStr(env,str);
     //c语言中的字符串 都是以'/0' 作为结尾
     char s1[7]={' ','h','e','l','l','o','\0'};
     strcat(s,s1);
     return (*env)->NewStringUTF(env,s);
 }
 
 JNIEXPORT jintArray JNICALL Java_com_forsta_ndk_NativeClass_array
   (JNIEnv *env, jobject obj, jintArray arr){
     //1。获取数组长度
     //2.修改每个数据
     int size=(*env)->GetArrayLength(env,arr);
     int * array=(*env)->GetIntArrayElements(env,arr,0);
     int i=0;
     for(;i<size;i++){
         array[i]+=10;
     }
     return arr;
 
 }
 JNIEXPORT jint JNICALL Java_com_forsta_ndk_NativeClass_sub
   (JNIEnv *env, jclass clazz, jint x, jint y){
     return x-y;
 }
«上一页12下一页»


相关评论