android jni registernatives,android开发--- jni使用RegisterNatives注册本地方法

1. 以前在jni中写本地方法时,都会写成 Java_com_example_hellojni_HelloJni_stringFromJNI的形式,函数名很长,而且当类名变了的时候,函数名必须一个一个的改,麻烦。

现在好了有了RegisterNatives,现在一片顶过去五片,蓝瓶的好喝的!

2. hello-jni.c中

#include

#include

#include

#define TAG "HELLO"

#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)

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

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , TAG, __VA_ARGS__)

#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , TAG, __VA_ARGS__)

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , TAG, __VA_ARGS__)

# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))

jstring native_stringFromJNI( JNIEnv* env, jobject thiz )

{

return (*env)->NewStringUTF(env, "Hello from JNI !");

}

static const char *classPathName = "com/example/hellojni/HelloJni";

static JNINativeMethod methods[] = {

{"stringFromJNI", "()Ljava/lang/String;", (void*)native_stringFromJNI},

};

jint JNI_OnLoad(JavaVM* vm, void* reserved)

{

JNIEnv* env = NULL;

jclass clazz;

//获取JNI环境对象

if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {

LOGE("ERROR: GetEnv failed\n");

return JNI_ERR;

}

//注册本地方法.Load 目标类

clazz = (*env)->FindClass(env,classPathName);

if (clazz == NULL)

{

LOGE("Native registration unable to find class '%s'", classPathName);

return JNI_ERR;

}

//注册本地native方法

if((*env)->RegisterNatives(env, clazz, methods, NELEM(methods)) < 0)

{

LOGE("ERROR: MediaPlayer native registration failed\n");

return JNI_ERR;

}

/* success -- return valid version number */

return JNI_VERSION_1_4;

}

a. System.loadLibrary("hello-jni"); 时会调用 JNI_OnLoad

b.

RegisterNatives

的第二个参数clazz包含了类的路径 c. 定义

JNINativeMethod时,第二个参数

()中的字符表示参数,后面表示返回值,

"()V"----> void func()

"(II)V"----> void func(int, int)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值