android-jni RegisterNatives注册本地方法

RegisterNatives的使用方法

在Android中通过jni调用本地方法(c/c++),通常使用javah生成规范的头文件,定义一个函数实现本地方法,函数名必须使用本地方法的全类名的规范来写。

Java_ + 包名 + 类名+ 接口名

注意名字之间用下划线,下面是示例:
JNIEXPORT jstring Java_com_example_test_MainActivity_helloworld(JNIEnv *, jclass );

有没有觉得这种写法太反人类了,其实jni还提供了RegisterNative函数手动的注册native方法,该方法可以自由命名函数,不必像上述方法那样拘泥特定烦杂的命名方式。
RegisterNatives使用示例:

static int registerNativeMethods(JNIEnv* env)
{
    jclass clazz;
    clazz = env->FindClass("com/example/test/MainActivity");
    if (clazz == NULL) {
        return JNI_FALSE;
    }
    if (env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) {
        return JNI_FALSE;
    }

    return JNI_TRUE;
}

RegisterNatives中第二个参数gMethods是一个二维数组,代表着这个class里的每一个native方法所对应的实现的方法。写法如下示例:

static JNINativeMethod gMethods[] = {
    {"helloworld", "()Ljava/lang/String;", (void*)Jni_helloworld}};

第三个参数代表要指定的native的数量。
这时将前面在jni中声明的

jstring JNIEXPORT jstring Java_com_example_test_MainActivity_helloworld(JNIEnv *, jclass );

改为

jstring helloworld(JNIEnv *, jclass);

是不是清爽了很多!

JNI字段描述符

在使用RegisterNatives注册本地方法中比较容易出错的地方就是JNINativeMethod gMethods[]其中的()Ljava/lang/String;
先解释下()Ljava/lang/String;的含义,它是一种对函数返回值和参数的编码,这种编码叫做JNI字段描述符(JavaNative Interface FieldDescriptors)。
JNI字段描述符的规则是在括号里放置参数,在括号后面放置返回类型:

(参数描述符)返回类型

例如()Ljava/lang/String;表示对应的java中的helloworld方法无传入参数,返回类型为String,即String helloworld();
这个示例可能过于简单,下面再举几个例子:
(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;表示String f(String a,Object b);
([B)Ljava/lang/String;表示String f(byte [] bytes);这里B表示java中的byte类型,[表示数组,[B表示byte []
以此类推,
[Ljava/lang/String;表示String []
[Ljava/lang/Object;表示Object[]
如果是二维数组int[][],用[[I表示。
另外要注意的是,引用类型(除基本类型的数组外)通常以"L"开头,以";"结尾,中间是用"/" 隔开的包及类名。所以";"分号是属于引用类型的一部分,因此参数中如果有多个参数的话是不用;间隔的。如:
(BI)V表示void f(byte b, int i);
(ILjava/lang/String;)V表示void f(int i,String s);

最后附上java类型与jni中字符对应的关系表:

Java 类型 符号
Boolean Z
Byte B
Char C
Short S
Int I
Long J
Float F
Double D
Void V
objects对象 L开头,以;结尾,中间是用/ 隔开的包及类名。比如:Ljava/lang/String;如果是嵌套类,则用$来表示嵌套。例如 (Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • _ 声明: 对原文格式以及内容做了细微的修改和美化, 主要为了方便阅读和理解 _ 一. 基础 Java Nativ...
    元亨利贞o阅读 5,865评论 0 34
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,531评论 18 399
  • 这个周六,我终于推掉了一个“朋友”的邀约,谎称加班。这是我终于忍无可忍的情况下,因为我感觉不舒服。 这位女朋友每个...
    求无1824阅读 366评论 2 0
  • 可能是个人习惯吧!每天都想写点什么,无论今天经历了什么,无论多晚!跟别人一起分享是一方面,另一方面自己也能有所...
    大葱love阅读 549评论 3 0
  • 华丽的水晶灯投下淡淡的光,使整个餐厅显得优雅而静谧。柔和的萨克斯曲充溢着整个餐厅,如一股无形的烟雾在蔓延着,慢慢地...
    蓝木格子L阅读 366评论 2 8