[安卓开发基础]NDK学习笔记 C调java

   C调java 利用反射:

-------------------------------------------------------------------------------------------------------------------------------------

   JNI类

package com.example.JNIDDemo1;

/**
 * Created by zengjx on 2018/4/11.
 */
public class JNI {
    static {
        System.loadLibrary("javaCallC");
    }
    //C语言调用 java空方法
    public   void   helloFromJava(){

        System.out.println("  C回调java 空方法  helloFromJava");

    }
    //C语言调用 java int方法
    public     int javaadd(int x,int y){

        System.out.println("javaadd");
        return  x+y;
    }
    //C语言调用 java String方法
    public     void print(String  s){

        System.out.println(s);

    }

    //写 native 方法
    public   native   int add(int x,int y);
    public   native   int  del(int a  ,int b);
    public  native    String  getHelloFromC();//获取字符串
    public   native   String   getString(String  str);
    public   native   int[]  getIntArray(int[] array);
    public   native   int   getStringLen(String str);
    public   native   byte[]  getByteArray(byte[] array);
    public    native   String getStringAdd(String   str);//字符串拼接

   //调用这个方法回调java空方法
    public  native void callbackVoidFuntion();
    //调用这个方法回调java int方法
    public   native  void  callbackIntFuntion();
    //调用这个方法回调java String 方法
    public   native   void callbackStringFuntion();
}
  • idea 在 deaCode\JNIDDemo1\out\production\JNIDDemo1\com\example\JNIDDemo1  下输入  javap -p  -s   类名  JNI 获取

  • descriptor描述:

:\ideaCode\JNIDDemo1\out\production\JNIDDemo1\com\example\JNIDDemo1>   javap -
 -s   JNI
警告: 二进制文件JNI包含com.example.JNIDDemo1.JNI
ompiled from "JNI.java"
ublic class com.example.JNIDDemo1.JNI {
 public com.example.JNIDDemo1.JNI();
   descriptor: ()V

 public void helloFromJava();
   descriptor: ()V

 public int javaadd(int, int);
   descriptor: (II)I

 public void print(java.lang.String);
   descriptor: (Ljava/lang/String;)V

 public native int add(int, int);
   descriptor: (II)I

 public native int del(int, int);
   descriptor: (II)I

 public native java.lang.String getHelloFromC();
   descriptor: ()Ljava/lang/String;

 public native java.lang.String getString(java.lang.String);
   descriptor: (Ljava/lang/String;)Ljava/lang/String;

 public native int[] getIntArray(int[]);
   descriptor: ([I)[I

 public native int getStringLen(java.lang.String);
   descriptor: (Ljava/lang/String;)I

 public native byte[] getByteArray(byte[]);
   descriptor: ([B)[B

 public native java.lang.String getStringAdd(java.lang.String);
   descriptor: (Ljava/lang/String;)Ljava/lang/String;

 public native void callbackVoidFuntion();
   descriptor: ()V

 public native void callbackIntFuntion();
   descriptor: ()V

 public native void callbackStringFuntion();
   descriptor: ()V

 static {};
   descriptor: ()V

src目录下生成头文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_JNIDDemo1_JNI */

#ifndef _Included_com_example_JNIDDemo1_JNI
#define _Included_com_example_JNIDDemo1_JNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_JNIDDemo1_JNI_add
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    del
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_JNIDDemo1_JNI_del
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    getHelloFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_JNIDDemo1_JNI_getHelloFromC
  (JNIEnv *, jobject);

/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    getString
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_JNIDDemo1_JNI_getString
  (JNIEnv *, jobject, jstring);

/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    getIntArray
 * Signature: ([I)[I
 */
JNIEXPORT jintArray JNICALL Java_com_example_JNIDDemo1_JNI_getIntArray
  (JNIEnv *, jobject, jintArray);

/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    getStringLen
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_com_example_JNIDDemo1_JNI_getStringLen
  (JNIEnv *, jobject, jstring);

/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    getByteArray
 * Signature: ([B)[B
 */
JNIEXPORT jbyteArray JNICALL Java_com_example_JNIDDemo1_JNI_getByteArray
  (JNIEnv *, jobject, jbyteArray);

/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    getStringAdd
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_JNIDDemo1_JNI_getStringAdd
  (JNIEnv *, jobject, jstring);

/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    callbackVoidFuntion
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_JNIDDemo1_JNI_callbackVoidFuntion
  (JNIEnv *, jobject);

/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    callbackIntFuntion
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_JNIDDemo1_JNI_callbackIntFuntion
  (JNIEnv *, jobject);

/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    callbackStringFuntion
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_JNIDDemo1_JNI_callbackStringFuntion
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

------------------------------------------------------------------------------------------------------------------------------------------------

C文件: javaCallC.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "com_example_JNIDDemo1_JNI.h"
#include <android/log.h>
#define  TAG "JNI_TAG"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)

  char* _JString2Cstr(JNIEnv* env,jstring  jstr);
  char*  Jstring2CStr(JNIEnv*  env,jstring  jstr);
   jstring CStr2Jstring( JNIEnv* env, const char* pat);
/*
 * Class:     com_example_JNITest2_JNI
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL  JNICALL Java_com_example_JNIDDemo1_JNI_add
  (JNIEnv *  env, jobject   jobject, jint x, jint   y){

    int result =0;
    result=x+y;
    LOGI("LOGI----result%d,%d,%d",x,y,result);
    /**************c调用java*****************/
    jclass  cls;
    jmethodID   mid;
    jmethodID   mid_add;
    jmethodID   mid_string;
    cls=(*env)->FindClass(env,"com/example/JNIDDemo1/JNI");
   //找到字节码
   mid= (*env)->GetMethodID(env,cls,"helloFromJava","()V");
   //找到方法

   //创建对象(可选  同一个java类中 不要创建对象jobject )
   //通过对象调用方法
    (*env)->CallVoidMethod(env,jobject,mid);
    //第二个 函数
    //public int javaadd(int, int);
    // descriptor: (II)I
     mid_add= (*env)->GetMethodID(env,cls,"javaadd","(II)I");
    //通过对象调用方法
      int   res  =(*env)->CallIntMethod(env,jobject,mid_add,123,456);
       LOGI("LOGI--c调用 java add--%d",res);

     //第3个
     //  public void print(java.lang.String);
      //  descriptor: (Ljava/lang/String;)V
        mid_string= (*env)->GetMethodID(env,cls,"print","(Ljava/lang/String;)V");
        //通过对象调用方法
        jstring   jstr =(*env)->NewStringUTF(env,"print  from  c");
       (*env)->CallVoidMethod(env,jobject,mid_string,jstr);
     return result;
  }

/*
 * Class:     com_example_JNITest2_JNI
 * Method:    del
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_JNIDDemo1_JNI_del
  (JNIEnv *env, jobject    jobject, jint   a, jint  b){
    int result =0;
    result=a-b;
    LOGI("LOGI----result%d",result);

     return   result;
  }

/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    getHelloFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_JNIDDemo1_JNI_getHelloFromC
  (JNIEnv *env, jobject   jclass){


  LOGI("LOGI---getHelloFromC\n");

//jstring  jstr = CStr2Jstring( JNIEnv* env, const char* pat)
char*  str=" i   am  from C+++++++++\n";
jstring  jstr = CStr2Jstring(env,str);
  return  jstr;


 // return  (**env).NewStringUTF(env,"String  from  C !!!\n");

  }
  char* _JString2Cstr(JNIEnv* env,jstring  jstr){
      char*  cstr=NULL;
      //获取String.class  字节码
       LOGI("LOGI----resultcstr%s","_JString2Cstr");
       jclass  classstring=(*env)->FindClass(env,"java/lang/String");//找到String 类型的字节码
        LOGI("LOGI----resultcstr%s","_JString2Cstr  2");
      jstring  strencode=(*env)->NewStringUTF(env,"GB2312");
          LOGI("LOGI----resultcstr%s","_JString2Cstr  3");
      //获取 方法 ID 号
      //找到 classstring 的   getByte 方法
      jmethodID  mid =(*env)->GetMethodID(env,classstring,"getBytes","Ljava/lang/String;)[B");
        LOGI("LOGI----resultcstr%s","_JString2Cstr  4");
  //    jbyteArray  barr=(jbyteArray)(**env).CallObjectMethod(env,jstr,mid,strencode);
  //下面这句话会报错;JNI DETECTED ERROR IN APPLICATION: JNI CallObjectMethod called with pending exception 'java.lang.NoSuchMethodError' thrown in java.lang.String com.example.JNIDDemo1.JNI.getStringAdd(java.lang.String):-2
   /*          12-12 14:21:16.876  21141-21141/com.example.JNIDDemo1 A/art﹕ art/runtime/check_jni.cc:65]     in call to CallObjectMethod
    */
        jbyteArray  barr=   (jbyteArray) (*env)->CallObjectMethod(env,jstr,mid,strencode);
        LOGI("LOGI----resultcstr%s","_JString2Cstr  5");
       //获取数组的长度
      jsize   alen =(*env)->GetArrayLength(env,barr);
      LOGI("LOGI----resultcstr_JString2Cstr  6 %d",alen);
      //获取数组首地址
      jbyte*   ba=(*env)->GetByteArrayElements(env,barr,JNI_FALSE);
      if(alen>0){//是否有内容
      cstr=(char*)malloc(alen+1);
      memcpy(cstr,ba,alen);
      cstr[alen]=0;//"结束符"
      }
     (*env)->ReleaseByteArrayElements(env,barr,ba,0);
      LOGI("LOGI---_JString2Cstr  end :%s",cstr);
         return  cstr;

  }

JNIEXPORT jstring JNICALL Java_com_example_JNIDDemo1_JNI_getString
    (JNIEnv *env, jobject   jobject, jstring   jstr){
     jsize    size;
     char  acbuf[]="wwwwwwwwwwwwwww";
     int   strlen=0;
     char *cstr;
     int  i=0;
   cstr = (*env)->GetStringUTFChars(env, jstr, NULL);//获得字符串转为 字符串指针
   if (cstr == NULL) {//用到分配内存可能会失败
      return NULL; /* OutOfMemoryError already thrown */
   }

    size= (*env)->GetStringUTFLength(env, jstr);
    LOGI("Get string from java size:%d\n",size);
   // strlen=strlen(cstr);
   // LOGI("Get string from java size:%d\n",strlen);
    LOGI("Get string from java :%s\n", cstr);


     for(i=0;i<size;i++){
        LOGI("Get string from java :%c\n", cstr[i]);
       *(cstr+i)+=1;
       LOGI("Get string from java :%c\n", cstr[i]);

     }
    // (*env)->ReleaseStringUTFChars(env, jstr, cstr);//释放空间
  //  return (*env)->NewStringUTF(env,acbuf);
     return (*env)->NewStringUTF(env,cstr);
    }
    /*
     * Class:     com_example_JNIDDemo1_JNI
     * Method:    getIntArray
     * Signature: ([I)[I
     */
JNIEXPORT jintArray JNICALL Java_com_example_JNIDDemo1_JNI_getIntArray
 (JNIEnv *env, jobject   jobject, jintArray   jarr){
       //获取数组的长度;
    int  len=   (*env)->GetArrayLength(env,jarr);
    int  i=0;
    //获取数组的首地址
    //最后一个参数为 0表示以不复制的方式获取
   jint* p =(*env)->GetIntArrayElements(env,jarr,0);
    LOGI("地址: %d---  %d    ---%d\n",p,*p,jarr);
    for(i=0;i<len;i++){
    LOGI("改变1:%d\n",*(p+i));
   *(p+i)+=100;
    (*env)->SetIntArrayRegion(env,jarr, i, 1, p+i);
     LOGI("改变2:%d\n",*(p+i));

    }
     //安卓中最后一个参数  为null 不会复制副本
      jboolean  isCopy=NULL;
    int* p1 =(*env)->GetIntArrayElements(env,jarr,&isCopy);
     for(i=0;i<len;i++){
         LOGI("改变后:%d\n",*(p1+i));

        }
    //由于在原数组中直接修改所以
    return jarr;
}


/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    getByteArray
 * Signature: ([B)[B
 */
JNIEXPORT jbyteArray JNICALL Java_com_example_JNIDDemo1_JNI_getByteArray
  (JNIEnv *env, jobject    jobject, jbyteArray    byteArray){

    jbyte* receivedbyte = (*env)->GetByteArrayElements(env,byteArray, 0);
       jsize size = (*env)->GetArrayLength(env,byteArray);
       for (int i = 0; i < size; i++) {
           int value = (int)(receivedbyte[i] & 0xff);
           LOGI("byteArray---%d\t",value);
        //   jbyte v = (~value);
         jbyte v = value+100;
          LOGI("byteArray2---%d\t",v);
           (*env)->SetByteArrayRegion(env,byteArray, i, 1, &v);
       }
       return byteArray;
  }



/*
 * Class:     com_example_JNIDDemo1_JNI
 * Method:    getStringAdd
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_JNIDDemo1_JNI_getStringAdd
  (JNIEnv *env, jobject   jclass, jstring    jstr){
 char* p=Jstring2CStr(env,jstr);

//char* p  =JString2Cstr(env,jstr);
  LOGI("java传递的字符串---%s\n",p);
  //字符串数组
  char*  newStr="nihao";

 return  (*env)->NewStringUTF(env,strcat(p,newStr));

  }



  /**

      利用Java的String类来完成字符编码转换

  */

  char*  Jstring2CStr(JNIEnv*  env,jstring  jstr)
  {
      LOGI("enter CStr2Jstring 1");
      char*   rtn   =   NULL;
      jclass   clsstring   =   (*env)->FindClass(env,"java/lang/String");
      jstring   strencode   =  (*env)->NewStringUTF(env,"GB2312");//转换成Cstring的GB2312,兼容ISO8859-1
      //jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);第二个参数是方法名,第三个参数是getBytes方法签名
      //获得签名:javap -s java/lang/String:   (Ljava/lang/String;)[B
      jmethodID   mid   =   (*env)->GetMethodID(env,clsstring,"getBytes","(Ljava/lang/String;)[B");
      //等价于调用这个方法String.getByte("GB2312");
      //将jstring转换成字节数组
      LOGI("enter CStr2Jstring 2");
      //用Java的String类getByte方法将jstring转换为Cstring的字节数组
      jbyteArray  barr=   (jbyteArray) (*env)->CallObjectMethod(env,jstr,mid,strencode);
      LOGI("enter CStr2Jstring 3");
      jsize   alen   =   (*env)->GetArrayLength(env,barr);
      LOGI("enter CStr2Jstring 4");
      jbyte*   ba   =   (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
      LOGI("alen=%d\n",alen);
      if(alen   >   0)
      {
          rtn   =   (char*)malloc(alen+1+128);
          LOGI("rtn address == %p",&rtn);//输出rtn地址
          memcpy(rtn,ba,alen);
          rtn[alen]=0;            //"\0"
      }
      (*env)->ReleaseByteArrayElements(env,barr,ba,0);
      return rtn;
  }

  /**
   * C的字符串转jstring的字符串
   */
  jstring CStr2Jstring( JNIEnv* env, const char* pat)
  {

   //jclass strClass = (*env)->FindClass(env,"Ljava/lang/String;");
    jclass strClass  =   (*env)->FindClass(env,"java/lang/String");
      jmethodID mID = (*env)->GetMethodID(env,strClass, "<init>", "([BLjava/lang/String;)V");
      jbyteArray bytes = (*env)->NewByteArray(env,(jsize)strlen(pat));
      (*env)->SetByteArrayRegion(env,bytes, 0, (jsize)strlen(pat), (jbyte*)pat); //将char* 转换为byte数组
      jstring encoding = (*env)->NewStringUTF(env,"GB2312");
      return (jstring)(*env)->NewObject(env,strClass, mID, bytes, encoding);
  }
  /*---------------------
  作者:JQ_AK47
  来源:CSDN
  原文:https://blog.csdn.net/jq_ak47/article/details/53428101
  版权声明:本文为博主原创文章,转载请附上博文链接!
  -------------------------------------------------*/
  /*
     Funtion:调用 java 的空方法
   * Class:     com_example_JNIDDemo1_JNI
   * Method:    callbackVoidFuntion
   * Signature: ()V
   */
  JNIEXPORT void JNICALL Java_com_example_JNIDDemo1_JNI_callbackVoidFuntion
    (JNIEnv *env, jobject   obj){
        jclass  cls;
        jmethodID   mid;
        jmethodID   mid_add;
        jmethodID   mid_string;
      LOGI("-------------JNIDDemo1_JNI_callbackVoidFuntion--------------------\n");
    //   函数原型:jclass (JNICALL *FindClass)(JNIEnv *env, const char *name);
    //1.找到字节码   第二个参数: 要找到字节码对应类的路径
    jclass   clazz =(*env)->FindClass(env,"com/example/JNIDDemo1/JNI");
    //2.找到方法
    // jmethodID (JNICALL *GetMethodID)  (JNIEnv *env, jclass clazz, const char *name, const char *sig);
    // public void helloFromJava();  第三个参数函数名称
    //   descriptor: ()V   //第4个参数    Java方法参数
    jmethodID   jmethodID=(*env)->GetMethodID(env,clazz,"helloFromJava","()V");
    //3创建对象. 可选,如果native 和要回调的方法在同一个类里面就不要创建对象
    //直接使用  jobject
    //4. 通过对象调用方法
    //    void (JNICALL *CallVoidMethod)//      (JNIEnv *env, jobject obj, jmethodID methodID, ...);
    //第一个参数:env
    //第二个参数: 要调用方法的对象  obj
    //要调用的方法ID  jmethodID
    // 第四个参数 可变参数
    (*env)->CallVoidMethod(env,obj,jmethodID);

        cls=(*env)->FindClass(env,"com/example/JNIDDemo1/JNI");
       //找到字节码
        mid= (*env)->GetMethodID(env,cls,"helloFromJava","()V");
       //找到方法

       //创建对象(可选  同一个java类中 不要创建对象jobject )
       //通过对象调用方法
        (*env)->CallVoidMethod(env,obj,mid);

    }

  /* Funtion:传递整型
   * Class:     com_example_JNIDDemo1_JNI
   * Method:    callbackIntFuntion
   * Signature: ()V
   */
  JNIEXPORT void JNICALL Java_com_example_JNIDDemo1_JNI_callbackIntFuntion
   (JNIEnv *env, jobject   obj){
     //   函数原型:jclass (JNICALL *FindClass)(JNIEnv *env, const char *name);
       //1.找到字节码   第二个参数: 要找到字节码对应类的路径
       jclass   clazz =(*env)->FindClass(env,"com/example/JNIDDemo1/JNI");
       //2.找到方法
       // jmethodID (JNICALL *GetMethodID)  (JNIEnv *env, jclass clazz, const char *name, const char *sig);
      /// public int javaadd(int, int);
      //      descriptor: (II)I

       jmethodID   jmethodID=(*env)->GetMethodID(env,clazz,"javaadd","(II)I");

       //3创建对象. 可选,如果native 和要回调的方法在同一个类里面就不要创建对象
       //直接使用  jobject
       //4. 通过对象调用方法
       //    void (JNICALL *CallVoidMethod)//      (JNIEnv *env, jobject obj, jmethodID methodID, ...);

       //第一个参数:env
       //第二个参数: 要调用方法的对象  obj
       //要调用的方法ID  jmethodID
       // 第四个参数 可变参数
       int ret=     (*env)->CallIntMethod(env,obj,jmethodID,123,456);
        LOGI("LOGI--c调用 java add--%d",ret);
 }
  /* Funtion:传递字符串
   * Class:     com_example_JNIDDemo1_JNI
   * Method:    callbackStringFuntion
   * Signature: ()V
   */

  JNIEXPORT void JNICALL Java_com_example_JNIDDemo1_JNI_callbackStringFuntion
   (JNIEnv *env, jobject   obj){
  //   函数原型:jclass (JNICALL *FindClass)(JNIEnv *env, const char *name);
    //1.找到字节码   第二个参数: 要找到字节码对应类的路径
    jclass   clazz =(*env)->FindClass(env,"com/example/JNIDDemo1/JNI");
    //2.找到方法
    // jmethodID (JNICALL *GetMethodID)  (JNIEnv *env, jclass clazz, const char *name, const char *sig);
    // public void helloFromJava();  第三个参数函数名称
    //   descriptor: ()V   //第4个参数    Java方法参数
    jmethodID   jmethodID=(*env)->GetMethodID(env,clazz,"print","(Ljava/lang/String;)V");

     jstring   jstr =(*env)->NewStringUTF(env,"C数据   print  from  c ");
      (*env)->CallVoidMethod(env,obj,jmethodID,jstr);

     LOGI("LOGI--c调用 java  print-");
 }

------------------------------------------------------------------------------------------------------------------------------------------------

Android.mk:

  LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 LOCAL_MODULE    :=javaCallC
 LOCAL_SRC_FILES := javaCallC.c
 LOCAL_LDLIBS += -llog
 include $(BUILD_SHARED_LIBRARY)
 #include $(BUILD_STATIC_LIBRARY)

----------------------------------------------------------------------------------------------------------------------------------------------

编译:

运行结果:

12-13 13:58:09.680  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ LOGI----result12,23,35
12-13 13:58:09.680  19981-19981/com.example.JNIDDemo1 I/System.out﹕ C回调java 空方法  helloFromJava
12-13 13:58:09.680  19981-19981/com.example.JNIDDemo1 I/System.out﹕ javaadd
12-13 13:58:09.680  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ LOGI--c调用 java add--579
12-13 13:58:09.680  19981-19981/com.example.JNIDDemo1 I/System.out﹕ print  from  c
12-13 13:58:09.681  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ LOGI----result12,23,35
12-13 13:58:09.681  19981-19981/com.example.JNIDDemo1 I/System.out﹕ C回调java 空方法  helloFromJava
12-13 13:58:09.683  19981-19981/com.example.JNIDDemo1 I/System.out﹕ javaadd
12-13 13:58:09.683  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ LOGI--c调用 java add--579
12-13 13:58:09.683  19981-19981/com.example.JNIDDemo1 I/System.out﹕ print  from  c
12-13 13:58:09.683  19981-19981/com.example.JNIDDemo1 I/MyActivity﹕ 计算结果:35
12-13 13:58:09.684  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 地址: -1219296544---  1    ----1095299104
12-13 13:58:09.684  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变1:1
12-13 13:58:09.684  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变2:101
12-13 13:58:09.684  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变1:2
12-13 13:58:09.684  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变2:102
12-13 13:58:09.684  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变1:3
12-13 13:58:09.684  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变2:103
12-13 13:58:09.685  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变1:4
12-13 13:58:09.685  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变2:104
12-13 13:58:09.685  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变1:5
12-13 13:58:09.685  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变2:105
12-13 13:58:09.685  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变后:101
12-13 13:58:09.685  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变后:102
12-13 13:58:09.685  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变后:103
12-13 13:58:09.685  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变后:104
12-13 13:58:09.685  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ 改变后:105
12-13 13:58:09.689  19981-19981/com.example.JNIDDemo1 I/int数组返回结果﹕ 101
12-13 13:58:09.689  19981-19981/com.example.JNIDDemo1 I/int数组返回结果﹕ 102
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/int数组返回结果﹕ 103
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/int数组返回结果﹕ 104
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/int数组返回结果﹕ 105
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ byteArray---10
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ byteArray2---110
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ byteArray---20
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ byteArray2---120
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ byteArray---30
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ byteArray2----126
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ byteArray---59
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ byteArray2----97
12-13 13:58:09.690  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ byteArray---43
12-13 13:58:09.691  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ byteArray2----113
12-13 13:58:09.691  19981-19981/com.example.JNIDDemo1 I/byte数组返回结果﹕ 110
12-13 13:58:09.691  19981-19981/com.example.JNIDDemo1 I/byte数组返回结果﹕ 120
12-13 13:58:09.691  19981-19981/com.example.JNIDDemo1 I/byte数组返回结果﹕ -126
12-13 13:58:09.691  19981-19981/com.example.JNIDDemo1 I/byte数组返回结果﹕ -97
12-13 13:58:09.691  19981-19981/com.example.JNIDDemo1 I/byte数组返回结果﹕ -113
12-13 13:58:09.691  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ LOGI---getHelloFromC
12-13 13:58:09.694  19981-19981/com.example.JNIDDemo1 I/获取字符串===﹕ i   am  from C+++++++++
12-13 13:58:09.695  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ enter CStr2Jstring 1
12-13 13:58:09.695  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ enter CStr2Jstring 2
12-13 13:58:09.695  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ enter CStr2Jstring 3
12-13 13:58:09.695  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ enter CStr2Jstring 4
12-13 13:58:09.695  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ alen=23
12-13 13:58:09.695  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ rtn address == 0xbeb70f8c
12-13 13:58:09.696  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ java传递的字符串--- i am  from  java -----
12-13 13:58:09.696  19981-19981/com.example.JNIDDemo1 I/获取字符串拼接===﹕ i am  from  java -----nihao
12-13 13:58:09.696  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ -------------JNIDDemo1_JNI_callbackVoidFuntion--------------------
12-13 13:58:09.696  19981-19981/com.example.JNIDDemo1 I/System.out﹕ C回调java 空方法  helloFromJava
12-13 13:58:09.696  19981-19981/com.example.JNIDDemo1 I/System.out﹕ C回调java 空方法  helloFromJava
12-13 13:58:09.696  19981-19981/com.example.JNIDDemo1 I/System.out﹕ javaadd
12-13 13:58:09.696  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ LOGI--c调用 java add--579
12-13 13:58:09.696  19981-19981/com.example.JNIDDemo1 I/System.out﹕ C数据   print  from  c
12-13 13:58:09.697  19981-19981/com.example.JNIDDemo1 I/JNI_TAG﹕ LOGI--c调用 java  print-
 

猜你喜欢

转载自blog.csdn.net/oDianZi1234567/article/details/84987534