动态注册jni函数

来源:互联网 发布:c语言幻数 编辑:程序博客网 时间:2024/06/04 20:08

android系统中,JNI的注册对文件的路径与名字有特定的规范,以下以模块ModuleAAA的开发为例来说明JNI调用的使用方法。

1、在frameworks/base/core/java/android/hardware/路径下创建文件ModuleAAA.java 声明本地方法。

其内容大致如下:

package android.hardware;

public class ModuleAAA{

 public void modulePowerOn(){
  JNI_modulePowerOn();
  }
 public void modulePowerOff(){
  JNI_modulePowerOff();
  }

 private static native int JNI_modulePowerOn();
 private static native int JNI_modulePowerOff();

}


ModuleAAA.java解说:(1)  方法 modulePowerOn() 与 modulePowerOff() 作为向JAVA层提供的接口,应用程序可通过如下方式调用此JNI接口:

import  android.hardware.ModuleAAA;

public class xxxxx   extends Activity{
 private ModuleAAA  instance = new ModuleAAA();   //创建实例

        public  void function_B {

            instance.modulePowerOn();

           instance.modulePowerOff();

        }

}

(2)方法 JNI_modulePowerOn() 与 JNI_modulePowerOff() 为 android_hardware_moduleAAA.cpp 中数组 static JNINativeMethod gMethods[] 中声明的函数

 

2、 在frameworks/base/core/jni/  路径下创建文件 android_hardware_moudleAAA.cpp ,实现本地方法。

其内容大致如下:

#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
...#include ...

using namespace android ;

 

void xxxCCC ()

{

    ....

}

void xxxDDD ()

{

    ....

}

 

/********************************************************************
 * Current JNI
 *******************************************************************/

/* native interface */

 

static jint android_hardware_modulePowerOn
  (JNIEnv *env, jobject object)
{
 ...

 xxxCCC();
 return 0;
}

static jint android_hardware_intercomPowerOff
  (JNIEnv *env, jobject object)
{
 ...

xxxDDD();

 return 0;
}

 

/*
 * JNI registration.
 */

static JNINativeMethod gMethods[] = {
        { "JNI_modulePowerOn", "()I",
            (void*)android_hardware_modulePowerOn},
        { "JNI_modulePowerOff", "()I",
            (void*)android_hardware_modulePowerOff},
 };

int register_android_hardware_moduleAAA(JNIEnv* env)
{
        return jniRegisterNativeMethods(env, "android/hardware/ModuleAAA", gMethods, NELEM(gMethods));
}

android_hardware_moudleAAA.cpp解说:

(1).语句jniRegisterNativeMethods(env, "android/hardware/ModuleAAA", gMethods, NELEM(gMethods));中声明了声明本地方法的类的路径 android/hardware/ModuleAAA(其前缀还有frameworks/base/core/java/);

(2).数组static JNINativeMethod gMethods[]的第一个变量名必须与.java声明的方法名字一致;

(3).数组static JNINativeMethod gMethods[]的第三个变量名为其对应的本地方法名字;

(4).可以本地方法(如android_hardware_modulePowerOff)中调用C函数。

(5)数组JNINativeMethod 的用法 详见 http://blog.csdn.net/duxingke15/article/details/7357587

 

3、修改frameworks/base/core/jni/Android.mk,将实现本地方法的源码(android_hardware_moduleAAA.cpp)添加到系统中

        LOCAL_SRC_FILES += android_hardware_moduleAAA.cpp


4、修改frameworks/base/core/jni/AndroidRuntime.cpp,注册JNI方法

extern int register_android_hardware_intercom(JNIEnv* env); //声明外部jni函数,见android_hardware_moduleAAA.cpp


static const RegJNIRec gRegJNI[] = {

...

...

REG_JNI(register_android_hardware_moduleAAA),  //注册Jni函数

...

};

至此完成jni方法的注册。