Android java层和C层的相互调用
来源:互联网 发布:ghost软件哪个好 编辑:程序博客网 时间:2024/04/28 20:00
在android的VM里,可以加载C模块(也就是so库),及通过System.loadLibrary()函数来加载。当加载某个so库时,VM会先执行其实现的JNI_Onload函数。该函数的原型为:exern "c" jint JNI_Onload(JavaVM* vm, void* reserved); 注意每个线程调用这个so库时传入的vm会不同。保证线程安全的代码必须注意对此vm的判断。
于是,我们可以在JNI_Onload函数里进行一些初始化工作,可以向java层注册c层的native函数,实现java层向c层的调用。
利用传入的vm我们可以得到JNIEnv 指针,然后利用jniResiterNativMetheds函数来实现向java层注册C函数。首先定义一个结构:
static JNINativeMethod sMethods[] = {
/*name,signature,funcptr */
{"close","(I)V" ,(void*)android_close},
{....... },
};
return jniRegisterNativeMethods(env,"com/android/server/AlarmService",sMethods,NELEM(sMethods));
然后在C层实现static void android_close(JNIEnv *env, jobject obj)函数。
OK,到这就可以在java的AlarmService类里声明一个这样的函数:
private static native void close();
调用它就进入了该so模块。所有这一切都是android的java虚拟机帮我们完成的。
反之,利用java虚拟机,我们也可以完成从c层回调java层。利用的还是那个很重要的类变量JNIEnv env.
FindClass();
GetMethodID();
CallObjectMethod();
CallStaticObjectMethod();
具体的细节可以参考手册。
- Android java层和C层的相互调用
- Android JNI实现简单的c层调用Java层函数(C层调用Java层Toast进行提示)
- java service 层的相互调用问题
- Android Jni层调用应用层(Java)的方法
- Android 中Java 和C/C++的相互调用方法
- Android 中Java 和C/C++的相互调用方法
- Android 中Java 和C/C++的相互调用方法
- Android 中Java 和C/C++的相互调用方法
- Android 中Java 和C/C++的相互调用方法
- Android JNI之JAVA调用C/C++层
- JNI学习(一)(c和java层对象互相调用)
- Android中framework层的cpp文件中调用native层c函数的方法
- java中SSM整合shiro dubbo service层相互调用
- c/c++ native 层 通过 JNI API 调用 java 层 的AudioTrack 来播放 音频文件
- android binder - 客户端(java层) 调用 服务端(c++层) 例子
- android binder - 客户端(java层) 调用 服务端(c++层) 例子
- NativeActivity通过jni调用java层的Android API
- NativeActivity通过jni调用java层的Android API
- 驱动程序里ioctl下switch问题
- IOS 开发codesign错误
- SOA 11G ANT 编译部署项目
- hive创建分区表问题
- 如何用回车键提交【无表单数据】?
- Android java层和C层的相互调用
- qvfb中不能显示中文
- 日志打印到屏幕同时保存到文件及获取管道返回状态
- java concurrent系列3---ReentrantLock
- eclipse插件开发常用的选择器
- 鸟哥的Linux学习笔记
- Ubuntu 10.10/11.10下安装与配置Squid代理软件
- 数据库行列互换
- errno — Standard errno system symbols