Android JNI之静态注册

这篇说静态注册,所谓静态注册,就是native的方法是直接通过方法名的规定格式和Java端的声明处代码对应起来的,其对应规则如下:

JNIEXPORT <返回值> JNICALL Java_<包路径(.换成_)>_<类名>_<方法名>(JNIEnv *, jobject<,方法参数>)

 

假设在HelloJni中声明了方法staticLoad(), 如下所示:

package com.example.zhanghaiqiang.hellojni;

public class HelloJni {
    static{
        System.loadLibrary("main");
    }

    public native void staticLoad();
}

则其对应的native方法名为

JNIEXPORT void JNICALL Java_com_example_zhanghaiqiang_hellojni_AndroidJni_dynamicLog
  (JNIEnv *, jobject)

当然,这个规则并不需要死记,jdk中的javah自动就帮我们做这个事了,cd到java目录下,执行  javah <包路径>.<类名>  ,就会在当前目录下生成对应的natvie类 的头文件,比如上面的HelloJni,执行javah后得到的com_example_zhanghaiqiang_hellojni_HelloJni.h文件内容就会像这样:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_zhanghaiqiang_hellojni_HelloJni */

#ifndef _Included_com_example_zhanghaiqiang_hellojni_HelloJni
#define _Included_com_example_zhanghaiqiang_hellojni_HelloJni
#ifdef __cplusplus
extern "C" {
#endif

/*
 * Class:     com_example_zhanghaiqiang_hellojni_HelloJni
 * Method:    staticLog
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_zhanghaiqiang_hellojni_HelloJni_staticLog
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

随后,把这个文件拷到预设的jni目录下,copy一份并改名为.c或者.cpp源文件(当然你也可以直接把这个.h文件改成源文件),然后就可以开始写native的方法实现了。

 

posted @ 2017-09-04 13:02  行走的段子  阅读(241)  评论(0编辑  收藏  举报