Android jni 编程(参数的传递,成员,方法的)相互访问
2014-04-03 15:32
169 查看
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_test_androidjni_MainActivity */ #ifndef _Included_com_test_androidjni_MainActivity #define _Included_com_test_androidjni_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: com_test_androidjni_MainActivity * Method: GetNativeString * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_test_androidjni_MainActivity_GetNativeString (JNIEnv *, jobject, jstring); /* * Class: com_test_androidjni_MainActivity * Method: SumArray * Signature: ([II)I */ JNIEXPORT jint JNICALL Java_com_test_androidjni_MainActivity_SumArray (JNIEnv *, jobject, jintArray, jint); /* * Class: com_test_androidjni_MainActivity * Method: SumArrayA * Signature: ([I)I */ JNIEXPORT jint JNICALL Java_com_test_androidjni_MainActivity_SumArrayA (JNIEnv *, jobject, jintArray); /* * Class: com_test_androidjni_MainActivity * Method: SumArray2D * Signature: ([[I)I */ JNIEXPORT jint JNICALL Java_com_test_androidjni_MainActivity_SumArray2D (JNIEnv *, jobject, jobjectArray); /* * Class: com_test_androidjni_MainActivity * Method: ModifyArray2d * Signature: ([[I)[[I */ JNIEXPORT jobjectArray JNICALL Java_com_test_androidjni_MainActivity_ModifyArray2d (JNIEnv *, jobject, jobjectArray); /* * Class: com_test_androidjni_MainActivity * Method: AccessField * Signature: ()V */ JNIEXPORT void JNICALL Java_com_test_androidjni_MainActivity_AccessField (JNIEnv *, jobject); /* * Class: com_test_androidjni_MainActivity * Method: AccessMethod * Signature: ()V */ JNIEXPORT void JNICALL Java_com_test_androidjni_MainActivity_AccessMethod (JNIEnv *, jobject); /* * Class: com_test_androidjni_MainActivity * Method: signature * Signature: (Ljava/lang/String;IBCZJDFS)V */ JNIEXPORT void JNICALL Java_com_test_androidjni_MainActivity_signature (JNIEnv *, jobject, jstring, jint, jbyte, jchar, jboolean, jlong, jdouble, jfloat, jshort); #ifdef __cplusplus } #endif #endif
com_test_androidjni_MainActivity.h
jni.h 这个头文件在android-ndk包中的platroms/具体的api包的inlcude中。
关于android jni编程,java与c,c++之间数据的传递都在jni.h这个头文件中.根据类型结构,可知为什么不可以在c中,直接访问java传入的jstring或一些其他类型
它们的类若是void*的,那么就无法访问了。因为我们不知道它在内存的布局,占几个字节,也就无法访问。这就是所谓不透明类型。另外对于c++里面访问java,实
际是对c的封装.
我们注意一下jni.h中
#if defined(__cplusplus)//这里表示是c++用的 typedef _JNIEnv JNIEnv;//这是native方法的第一个参数 typedef _JavaVM JavaVM;//这个是虚拟机 #else typedef const struct JNINativeInterface* JNIEnv; typedef const struct JNIInvokeInterface* JavaVM; #endif struct JNINativeInterface{ //具体内容省略, //它们都是一些函数指针,这个结构体,每个native方法的第一个参数JNIEnv env 就是它自己 }; 另外注意一下 //这两个方法,是由java虚拟机调用的,它传入一个vm,通过vm我们可以得到JNIEnv,通过JNIEnv我们可以得到 //java与c,c++之间的交互接口。 JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved); JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved);
上面这些代码,是对<JNI编程指南> 前4章方法的汇总.也总结了许多网友的代码,并对其做了一些修改,加入了自己的理解。
private static final String DEBUGTAG = "NATIVE"; private String myString; private static int si=0; private static String helloString = "What's your name"; //对基本数据类型的访问 private native String GetNativeString(String str);//访问字串 private native int SumArray(int [] ar, int length);//传一个数组的长度 private native int SumArrayA(int [] ar);//不传长度 private native int SumArray2D(int [][]ar2d);//传一个二维数组,返回一个长度 private native int [][] ModifyArray2d(int [][]ar2d);//传入一个二维数组,返回一个二维数组 //这一部分是对成员和方法的访问 private native void AccessField();//访问静态成员 private native void AccessMethod(); //这个方法是为了生成一个包括所有基本类型的方法签名,请查看头文件 private native void signature(String str1, int i,byte b,char c,boolean bl,long l,double d,float f,short sh);
相关文章推荐
- Android下常见的内存泄漏
- Android中的Spinner 下拉列表的用法
- 关于android闹钟,设置定时提醒的一点心得
- android调用.net的webservice的例子获取手机的归属地
- android:descendantFocusability用法简析
- Android adt22.6.1->22.6.2更新后报Exception raised during rendering: Empty region!
- [Android学习笔记]jackson库的使用
- [Android学习笔记]some tips
- AIDL-Android接口描述语言实现跨进程通讯
- Android -- service 利用广播调用服务的方法
- Android -- service 利用广播调用服务的方法
- android圆角View实现及不同版本这间的兼容
- android中共享全局数据的方法(static导致的内存泄漏问题,但其实并未解决)
- android_API拦截技术与注入技术
- android_Service与Binder的关系
- android ContentProvider
- android_Surface,SurfaceView,Canvas的关系
- IntelliJ IDEA & Genymotion--接触新的开发工具
- android_OOM分析:缩小资源,及时释放
- android_Android操作系统的内存回收机制