您的位置:首页 > 其它

【JNI好学易用系列】之三:JNI方法调用

2015-05-04 15:43 162 查看
作者:郭嘉

邮箱: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方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: