Android JNI之静态注册

Posted 行走的段子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的方法实现了。

 

以上是关于Android JNI之静态注册的主要内容,如果未能解决你的问题,请参考以下文章

你应该了解的JNI知识——静态注册与动态注册

你应该了解的JNI知识——静态注册与动态注册

转深入了解android平台的jni---注册native函数

Android NDK- JNI 注册 Native 方法

Android NDK- JNI 注册 Native 方法

ndk之C调用java方法以及动态注册