【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
原创粉丝点击