转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930032.html html
public class TestNdk{
int a;//本示例中将被修改的JAVA变量 Handler handler; public TestNdk(Handler handler){ this.handler = handler; setUp(); } public native void setUp();//本地方法 public native static int getStringFromNative();//本地方法 public int getA() { return a; } public native void setA(int a);//本地方法 public void notifyFiledChange(){//本示例中将被C/C++调用的JAVA方法 Message message = new Message(); Bundle bundle = new Bundle(); bundle.putInt("a",a); message.setData(bundle); message.what=1; handler.sendMessage(message); } static { System.loadLibrary("MyJni");//导入生成的连接库文件 } }
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_x_mp4player_TestNdk */ #ifndef _Included_com_x_mp4player_TestNdk #define _Included_com_x_mp4player_TestNdk #ifdef __cplusplus extern "C" { #endif /* * Class: com_x_mp4player_TestNdk * Method: setUp * Signature: ()V */ JNIEXPORT void JNICALL Java_com_x_mp4player_TestNdk_setUp (JNIEnv *, jobject); /* * Class: com_x_mp4player_TestNdk * Method: setA * Signature: (I)V */ JNIEXPORT void JNICALL Java_com_x_mp4player_TestNdk_setA (JNIEnv *env, jobject thiz,jint i); /* * Class: com_x_mp4player_TestNdk * Method: getStringFromNative * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_x_mp4player_TestNdk_getStringFromNative (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
#include <jni.h>
#include <com_x_mp4player_TestNdk.h> jobject m_object; jmethodID m_mid; jfieldID m_fid; JNIEXPORT jint JNICALL Java_com_x_mp4player_TestNdk_getStringFromNative (JNIEnv *env, jclass cls) { return 1; } JNIEXPORT void JNICALL Java_com_x_mp4player_TestNdk_setUp (JNIEnv *env, jobject thiz) { jclass clazz = (*env).GetObjectClass(thiz);//获取该对象的类 m_object = (*env).NewGlobalRef(thiz);//建立对象的本地变量 m_mid =(*env).GetMethodID(clazz, "notifyFiledChange", "()V");//获取JAVA方法的ID m_fid = (*env).GetFieldID(clazz,"a","I");//获取java变量的ID return; } JNIEXPORT void JNICALL Java_com_x_mp4player_TestNdk_setA (JNIEnv *env, jobject thiz,jint i) { (*env).SetIntField( m_object, m_fid,i); (*env).CallVoidMethod(m_object,m_mid); return; }
在C/C++层获取类的对象的方法有两种:java
经过JAVA层调用本地方法(如示例中的setUp()方法),在调用时,会传入对象jobject或者对象的类jclassthis
JNIEXPORT void JNICALL Java_com_x_mp4player_TestNdk_setUp
(JNIEnv *env, jobject thiz) {
... jclass clazz = (*env).GetObjectClass(thiz);//获取该对象的类 ... return; }
经过C/C++建立java对象spa
方法以下:3d
1.经过JAVA层的本地方法建立同类对象code
步骤:htm
I.经过对象获取类对象
II.经过类获取类的构造方法的IDblog
III.基于方法ID和类,建立新对象get
JNIEXPORT void JNICALL JAVA_nativeMethod (JNIEnv *env, jobject thiz,jint i){ ... jclass clazz = (*env).GetObjectClass(thiz); jmethodID mid = (*env).GetMethodID(clazz,"<init>","()V"); jobject obj = (*env).NewObject(clazz,mid); ... return; }
2.经过C/C++建立不一样类对象
步骤:
I.经过FindClass方法获取须要的类
II.经过类获取类的构造方法的ID
III.基于方法ID和类,建立新对象
JNIEXPORT void JNICALL JAVA_nativeMethod (JNIEnv *env, jobject thiz,jint i){ ... jclass clazz = (*env).FindClass("com/x/test/Test");//参数为类路径 jmethodID mid = (*env).GetMethodID(clazz,"<init>","()V"); jobject obj = (*env).NewObject(clazz,mid); ... return; }
3.经过C++直接建立
5.C/C++直接存取JAVA变量