android jni 回调 java_Android jni中回调java的方法

//

//Created by yuany on 6/5/18.//#include #include"android/log.h"#include

#define LOG_TAG "C_TAG"

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

//native method

void myCallBack (JNIEnv *env, jclass jobj)

{

LOGD("myCallBack");

jclass clazz;//找到声明native方法的类

clazz = env->FindClass("com/example/scarecrow/dynamicregisterjni/Demo");if(clazz ==NULL){

LOGD("Findclass error");return;

}

LOGD("Findclass succeed");//寻找class里面的方法

jmethodID callbackID = env->GetStaticMethodID(clazz, "callback", "(Ljava/lang/String;)V");if(callbackID==0){

LOGD("find callback error");return;

}

LOGD("find callback");

jstring result= env->NewStringUTF("this is a callback from C++ codes");//invoke callback method

env->CallStaticVoidMethod(jobj,callbackID, result);

}//native method

jstring myDynamicJNI (JNIEnv *env, jclass jobj)

{

LOGD("myDynamicJNI");//invoke callback method

myCallBack(env, jobj);return env->NewStringUTF("This is my first dynamic JNI test");

}/*需要注册的函数列表,放在JNINativeMethod 类型的数组中,

以后如果需要增加函数,只需在这里添加就行了

参数:

1.java代码中用native关键字声明的函数名字符串

2.签名(传进来参数类型和返回值类型的说明)

3.C/C++中对应函数的函数名(地址)*/

static JNINativeMethod getMethods[] ={

{"sayHello","()Ljava/lang/String;",(void*)myDynamicJNI},

};//此函数通过调用JNI中 RegisterNatives 方法来注册我们的函数

static int registerNativeMethods(JNIEnv* env, const char* className,JNINativeMethod* getMethods,intmethodsNum){

LOGD("registerNativeMethods");

jclass clazz;//找到声明native方法的类

clazz = env->FindClass(className);if(clazz ==NULL){returnJNI_FALSE;

}

LOGD("after Findclass");//注册函数 参数:java类 所要注册的函数数组 注册函数的个数

if(env->RegisterNatives(clazz,getMethods,methodsNum) < 0){returnJNI_FALSE;

}

LOGD("after RegisterNatives");returnJNI_TRUE;

}//回调函数 在这里面注册函数

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*reserved){

LOGD("JNI_OnLoad");

JNIEnv* env =NULL;//判断虚拟机状态是否有问题

if(vm->GetEnv((void**)&env,JNI_VERSION_1_6)!=JNI_OK){return -1;

}

assert(env!=NULL);//指定类的路径,通过FindClass 方法来找到对应的类

const char* className = "com/example/scarecrow/dynamicregisterjni/Demo";//开始注册函数 registerNatives -》registerNativeMethods -》env->RegisterNatives

if(!registerNativeMethods(env,className,getMethods, 1)){return -1;

}//返回jni 的版本

returnJNI_VERSION_1_6;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值