【JNI好学易用系列】之三:JNI方法调用
来源:互联网 发布:苹果6s淘宝打字输入法 编辑:程序博客网 时间:2024/05/20 06:50
作者:郭嘉
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
github:https://github.com/AllenWells
【JNI探索之路系列】章节索引
【JNI探索之路系列】之一:JNI简介
【JNI探索之路系列】之二:变量类型
【JNI探索之路系列】之三:JNI方法调用
【JNI探索之路系列】之四:JNI应用接口
【JNI探索之路系列】之五:JNI异常处理
【JNI探索之路系列】之六:动态库的调用过程
一 函数注册
函数注册:将Java层的Native函数和JNI层对应的实现函数关联起来。
1.1 静态注册
静态方法是根据函数名类建立Java函数和JNI函数之间的关联关系(函数指针),JNI层函数的名字必须遵循特定的格式。
1.2 动态注册
JNINativeMethod结构保存Native函数和JNI层函数的一一对应关系。
tpedef struct{ const char *name; //Java函数的签名信息,用字符串表示,是参数类型和返回值类型的组合。 const char *signature; void * fnPtr; //JNI层对象函数的函数指针 }JNINativeMethod Jcalsss clazz = (*env)->FindClass(env, className); (*env)->RegisterNatives(env, clazz, gMethods, numMethods); }
当Java层通过System.loadLibrary()加载完JNI动态库以后,紧接着会查找该库中一个叫JNI_OnLoad的函数,如果有则加载它,而动态注册的工作就是在这里完成的。
二 函数调用
2.1 Java调用C
2.2 C调用Java
本地方法常常需要从传递给它的对象那里获取某种服务,因此需要调用Java方法。
2.2.1 调用Java实例方法
首先定义一个类
public class Blog{ String blogUrl = "http://blog.csdn.net/allenwells"; public Blog() { } public string getBlog() { return blogUrl; } public static int editBlog(String content) { return 0; }}
1 获取类的对象
const class_Blog_url = "com/allenwells/Blog";jclass class_Blog = env->FindClass(class_Blog_url); jmethodID constructor = env->GetMethodID(cls, "<init>", "()V");jobject obj_Blog = env->NewObject(class_Blog, constructor);
2 获取方法ID
jmethodID id_getBlog = env->GetMethodID(obj_Blog, "getBlog", "(V)Ljava/lang/String;");
3 进行调用
env->CallVoidMethod(obj_Blog);
2.2.2 调用Java静态方法
1 获取隐式参数的类
const class_Blog_url = "com/allenwells/Blog";jclass class_Blog = env->FindClass(class_Blog_url);
2 获取方法ID
jmethodID id_getBlog = env->GetStaticMethodID(class_Blog, "editBlog", "(Ljava/lang/String;)V ");
3 进行调用
env->CallStaticStringMethod(class_Blog);
2.2.3 调用Java构造方法
本地方法可以通过调用构造器来创建新的Java对象,可以调用NewObject函数来调用构造器。
const class_Blog_url = "com/allenwells/Blog";jclass class_Blog = env->FindClass(class_Blog_url); methodID constructor = env->GetMethodID(cls, "<init>", "()V");object obj_Blog = env->NewObject(class_Blog, constructor);
2.2.4替代方法调用
有若干种JNI函数的变体都可以从本地代码调用Java方法
0 0
- 【JNI好学易用系列】之三:JNI方法调用
- 【AJAX好学易用系列】之三:请求与响应
- android JNI 系列 三
- JNI学习之---用jni API 访问java对象的属性,方法,调用构造器。
- jsp调用jni方法
- JNI调用Java方法
- JNI调用Java方法
- JNI调用Java方法
- JNI调用C方法
- JNI调用Java方法
- JNI调用Java方法
- Android JNI调用方法
- JNI调用Java方法
- 【AJAX好学易用系列】之二:XMLHttpRequst对象
- 【JavaScript好学易用系列】之二:JavaScript语法
- Android JNI调用(三)
- Android JNI调用(三)
- Java JNI 调用C#方法
- keil 揭开PC-Lint9的神秘面纱
- 【JNI探索之路系列】之二:变量类型
- 某字符在某字符串中出现的次数
- Action向视图传值的6种方式
- padding的使用及定义
- 【JNI好学易用系列】之三:JNI方法调用
- Sum Root to Leaf Numbers
- 【JNI探索之路系列】之四:JNI应用接口
- 【JNI探索之路系列】之五:JNI异常处理
- lua中字符串匹配笔记
- 解决360 兼容模式下问题。
- android终端模拟器运行命令可以进行adb connect
- 【JNI探索之路系列】之六:动态库的调用过程
- Linux下使Shell 命令脱离终端在后台运行