Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78683
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 161
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-04 17:48
文章分类

全部博文(24)

文章存档

2015年(24)

我的朋友

分类: LINUX

2015-08-17 22:40:26

1. 以前在jni中写本地方法时,都会写成 Java_com_example_hellojni_HelloJni_stringFromJNI的形式,函数名很长,而且当类名变了的时候,函数名必须一个一个的改,麻烦。
现在好了有了RegisterNatives,现在一片顶过去五片,蓝瓶的好喝的!
2. hello-jni.c中
  1. #include <string.h>
  2. #include <jni.h>
  3. #include <android/log.h>

  4. #define TAG "HELLO"
  5. #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
  6. #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , TAG, __VA_ARGS__)
  7. #define LOGI(...) __android_log_print(ANDROID_LOG_INFO , TAG, __VA_ARGS__)
  8. #define LOGW(...) __android_log_print(ANDROID_LOG_WARN , TAG, __VA_ARGS__)
  9. #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , TAG, __VA_ARGS__)

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

  11. jstring native_stringFromJNI( JNIEnv* env, jobject thiz )
  12. {
  13.     return (*env)->NewStringUTF(env, "Hello from JNI !");
  14. }
  15. static const char *classPathName = "com/example/hellojni/HelloJni";

  16. static JNINativeMethod methods[] = {
  17.         {"stringFromJNI", "()Ljava/lang/String;", (void*)native_stringFromJNI},
  18. };

  19. jint JNI_OnLoad(JavaVM* vm, void* reserved)
  20. {
  21.     JNIEnv* env = NULL;
  22.     jclass clazz;
  23.     //获取JNI环境对象
  24.     if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
  25.         LOGE("ERROR: GetEnv failed\n");
  26.         return JNI_ERR;
  27.     }
  28.     //注册本地方法.Load 目标类
  29.     clazz = (*env)->FindClass(env,classPathName);
  30.     if (clazz == NULL)
  31.     {
  32.         LOGE("Native registration unable to find class '%s'", classPathName);
  33.         return JNI_ERR;
  34.     }
  35.     //注册本地native方法
  36.     if((*env)->RegisterNatives(env, clazz, methods, NELEM(methods)) < 0)
  37.     {
  38.         LOGE("ERROR: MediaPlayer native registration failed\n");
  39.            return JNI_ERR;
  40.     }

  41.     /* success -- return valid version number */
  42.     return JNI_VERSION_1_4;
  43. }
a. System.loadLibrary("hello-jni"); 时会调用 JNI_OnLoad
b. RegisterNatives的第二个参数clazz包含了类的路径
c. 定义
JNINativeMethod时,第二个参数
    ()中的字符表示参数,后面表示返回值,
    "()V"----> void func()
    "(II)V"----> void func(int, int)  
[参]http://www.cnblogs.com/keis/archive/2011/04/12/2013174.html
阅读(1123) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~