【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探索之路系列】之六:动态库的调用过程
当Java层通过System.loadLibrary()加载完JNI动态库以后,紧接着会查找该库中一个叫JNI_OnLoad的函数,如果有则加载它,而动态注册的工作就是在这里完成的。
1 获取类的对象
2 获取方法ID
3 进行调用
2 获取方法ID
3 进行调用
邮箱: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方法相关文章推荐
- java jni 入门6 - 调用Java方法 静态和非静态
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- 深入Atlas系列:综合示例(1) - 调用服务器端方法时直接获得客户端具体类型
- JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法
- cocos2d-x中使用JNI的调用JAVA方法
- 云星数据---Scala实战系列(精品版)】:Scala入门教程033-Scala实战源码-Scala apply方法01 调用
- JNI 调用构造方法和父类实例方法
- 使用JNA替代JNI调用本地方法
- HAL中通过jni调用java方法的问题
- Cocos2dx下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方案
- Java通过JNI调用C语言的方法
- Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
- .net知识和学习方法系列(九)委托异步调用方法a
- java通过jni调用opencv处理图像的方法
- android实现app通过jni调用C/C++方法
- java调用dll的几种方法(JNI,Jawin,Jacob)
- 【学习Android NDK开发】native code通过JNI调用Java方法
- Java中使用JNI调用本地动态库的方法
- JNI调用Java方法
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法实现边缘检测代码(2)