JNI_Onload的使用
来源:互联网 发布:淘宝信息管理在哪里 编辑:程序博客网 时间:2024/06/05 03:19
JNI_Onload在执行system.loadLibrary()函数时被调用,主要用途:
1.通过JNI_Onload告知VM,当前so库使用的JNI版本,最老的版本问JNI 1.1(JNI_Onload默认返回的是1.1版本),最新的JNI 1.4;其中JNI 1.4做了很多扩充。
2.可以在JNI_Onload中进行数据的初始化。
3.可以在JNI_Onload对java类中的native函数进行注册。java类是通过VM来调用本地方法,调用时需要通过VM在so库中寻找该本地函数,如果该本地函数需要频繁调用的话,会花费很多时间,可以在JNI_Onload调用registerNativeMethods,把native函数注册到VM中,减少寻找花费的时间。
实践:(1)在eclipse中创建一个android项目,新建一个JniMethod类,主要用来调用native方法。
JniMethod.java
package com.example.testjnionload;public class JniMethod {static{System.loadLibrary("tjnionlod");}public native void printLog();public native void addFunc(int a,int b);}
(2)在项目下新建一个jni文件夹,通过javah 生成JniMethod类中的native函数的声明头文件,如图1,2。
图1
图2
(3)在jni文件夹中新建一个jnimethod.c源文件,用于实现JNI_Onload和native函数。
jnimethod.c
#include <jni.h>#include <android/log.h>#include <stdio.h>#define TAG "jnimethod"#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)#define JNIREG_CLASS "com/example/testjnionload/JniMethod" //native函数的java类名JNIEXPORT void JNICALL native_printLog(JNIEnv *env, jobject obj){ //输出log信息LOGI("print my log");}JNIEXPORT void JNICALL native_addFunc(JNIEnv *env, jobject obj, jint a, jint b){ //在本地函数中实现加法int a1,b1,c1;a1=a;b1=b;c1=a1+b1;LOGI("addFunc return:%d",c1);}static JNINativeMethod gMethods[]={{"printLog","()V",(void*)native_printLog}, {"addFunc","(II)V",(void*)native_addFunc}}; //需要注册到VM的native函数-->java中声明的native函数,函数JNI类型,本地对于的native函数名static int registerNativeMethods(JNIEnv *env){//native函数的注册jclass clazz;LOGI("in registerNativeMethods");clazz=(*env)->FindClass(env,JNIREG_CLASS);if(clazz==NULL){return JNI_FALSE;}if((*env)->RegisterNatives(env,clazz,gMethods,sizeof(gMethods)/sizeof(gMethods[0]))<0){ //注册函数return JNI_FALSE;}return JNI_TRUE;}JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm,void* reserved){JNIEnv *env;jint result=-1;LOGI("in JNI_Onload");if((*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_4)!=JNI_OK){return -1;}//assert(env!=NULL);if(!registerNativeMethods(env)){return -1;}result=JNI_VERSION_1_4;//返回JNI 1.4版本信息给VMreturn result;}编写Android.mk文件LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE :=tjnionlodLOCAL_SRC_FILES :=jnimethod.cLOCAL_LDLIBS :=-lloginclude $(BUILD_SHARED_LIBRARY)然后在eclipse中调用ndk-build进行编译,生成对于的so文件。在android项目的主activity中,调用该native函数,如图3。图3
JNI_Onload的基本使用就完成了。和JNI_Onload对应的还有JNI_Unload,JNI_Onload在加载so文件时调用的,JNI_Unload在卸载so时调用的。
- JNI_Onload的使用
- 使用JNI_OnLoad()函数实现本地方法的注册
- Android Jni中JNI_OnLoad的地位和使用
- JNI_Onload的实现
- Java JNI_OnLoad的妙用
- Java JNI_OnLoad的妙用
- android:认识*.so里的JNI_OnLoad()函数
- 认识*.so里的JNI_OnLoad()函数
- 认识*.so里的JNI_OnLoad()函数
- JNI_Onload 的用法 版本返回一定要添加
- Android的JNI_OnLoad简介与应用
- JNI_OnLoad方法和RegisterNatives方法的结合
- (OK) Android的JNI_OnLoad简介与应用
- Android的JNI_OnLoad简介与应用
- Android JNI(实现自己的JNI_OnLoad函数)
- Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods
- Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods
- Android JNI(实现自己的JNI_OnLoad函数)
- 谁动了我的代码
- 长假即将结束
- 【算法导论之二】快速排序算法
- 归并排序和快速排序
- Delphi7.0开发OPC客户端程序(OPC DAAutomation 2.0接口)
- JNI_Onload的使用
- Android 编译错误:/usr/bin/ld: cannot find -lncurses
- Android 70道面试题汇总
- 强大的vim配置,让编程更随意
- higncharts 生成spider蜘蛛网图
- opencv中cvCalibrateCamera2()的函数细解
- Android开发---JNI基础知识
- 认识数字调谐收音机
- 2011蓝桥杯模拟题java本科