在android中通过JNI调用本地方法
2011-07-01 12:08
363 查看
JNI的核心是JNINativeMethod结构体,在jni.h中定义:
要实现java通过JNI调用本地C函数, 要有以下几步:
一:在C/C++中对本地函数定义JNINativeMethod结构体并在系统注册
例如frameworks/base/core/jni/中的android_util_Log.cpp表示对android.util包中的Log类提供支持。这个文件首先定义了所实现的java方法列表:
定义后只有对系统进行注册才能够使用,注册函数如下:
二:在java方法中声明为native方法。
public static native boolean isLoggable(String tag, int level);
/** @hide */ public static native int println_native(int bufID, int priority, String tag, String msg);
需要注意的是在注释中的@hide表示的是该方法虽然在java代码中是存在的,但是被隐藏的,不被视为Android的系统API。
上边的方法是在Android的系统API中增加本地接口,单一的java程序其实也是一样的方法调用本地接口,这样就无需更改系统API,android系统也提供了一个java程序直接调用本地接口的例子,在development/samples/目录下的SimpleJNI,可以参考学习下。
typedef struct { const char* name; //JNI函数的名称 const char* signature; //描述JNI函数的参数和返回值 void* fnPtr; //JNI函数对应的C语言的函数指针 } JNINativeMethod;
要实现java通过JNI调用本地C函数, 要有以下几步:
一:在C/C++中对本地函数定义JNINativeMethod结构体并在系统注册
例如frameworks/base/core/jni/中的android_util_Log.cpp表示对android.util包中的Log类提供支持。这个文件首先定义了所实现的java方法列表:
static JNINativeMethod gMethods[] = { {"isLoggable", "Ljava/lang/String;I)Z", (void*)android_util_Log_isLoggable), {"println_native", "(IILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println_native }, };
定义后只有对系统进行注册才能够使用,注册函数如下:
int register_android_util_Log(JNIEnv* env) { jclass clazz = env->FindClass("android/util/Log"); if (clazz == NULL) { LOGE("Can't find android/util/Log"); return -1; } levels.verbose = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "VERBOSE", "I")); levels.debug = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "DEBUG", "I")); levels.info = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "INFO", "I")); levels.warn = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "WARN", "I")); levels.error = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ERROR", "I")); levels.assert = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ASSERT", "I")); return AndroidRuntime::registerNativeMethods(env, "android/util/Log", gMethods, NELEM(gMethods)); }
二:在java方法中声明为native方法。
public static native boolean isLoggable(String tag, int level);
/** @hide */ public static native int println_native(int bufID, int priority, String tag, String msg);
需要注意的是在注释中的@hide表示的是该方法虽然在java代码中是存在的,但是被隐藏的,不被视为Android的系统API。
上边的方法是在Android的系统API中增加本地接口,单一的java程序其实也是一样的方法调用本地接口,这样就无需更改系统API,android系统也提供了一个java程序直接调用本地接口的例子,在development/samples/目录下的SimpleJNI,可以参考学习下。
相关文章推荐
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法实现边缘检测代码(2)
- [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- JAVA通过JNI调用本地C语言方法
- cocos2d-x中通过jni调用android方法
- JAVA通过JNI调用本地C语言方法
- android实现app通过jni调用C/C++方法
- JAVA通过JNI调用本地C语言方法
- 【学习Android NDK开发】Java通过JNI调用native方法
- JAVA通过JNI调用本地C语言方法
- JAVA通过JNI调用本地C语言方法
- Android-调用本地方法计算int数值相加结果显示在界面上/NDK-JNI开发实例(三)
- Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
- JAVA通过JNI调用本地C语言方法
- Android-调用本地方法实现将C进程分支出来即生成系统进程/NDK-JNI开发实例(九)
- cocos2d-x中通过jni调用android方法
- 10,JAVA通过JNI调用本地C语言方法
- Android的音频解码原来是直接调用的本地C方法直接通过硬件解码
- Android-本地方法与Java相互调用-自定义ProgressBar(锅炉压力监测例子)/NDK-JNI开发实例(七)