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-