您的位置:首页 > 移动开发 > Android开发

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: