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方法的注册。