`
yangzc106
  • 浏览: 154333 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

又是JNI

    博客分类:
  • jni
阅读更多

/**
 * 判断对象类型
 */
bool instanceof(JNIEnv *env, jobject obj, const char *clsName)
{
	jclass targetcls = env->FindClass(clsName);

	return env->IsInstanceOf( obj, targetcls);
}

/**
 * 设置Field 整型值
 */
void setIntField(JNIEnv *env, jobject obj, const char *fieldName, int value)
{
	jobject refobj = env->NewLocalRef(obj);

	jclass targetcls = env->GetObjectClass(refobj);

	jfieldID fieldid = env->GetFieldID(targetcls, fieldName, "I");

	if(fieldid == NULL)
		return;

	env->SetIntField(obj, fieldid, value);

	env->DeleteLocalRef(targetcls);

	env->DeleteLocalRef(refobj);
}

/**
 * 设置Field 字符串
 */
void setStringField(JNIEnv *env, jobject obj, const char *fieldName, const char* value)
{
	jobject refobj = env->NewLocalRef(obj);

	jclass targetcls = env->GetObjectClass(refobj);

	jfieldID fieldid = env->GetFieldID(targetcls, fieldName, "Ljava/lang/String;");

	if(fieldid == NULL)
		return;

	env->SetObjectField(obj, fieldid, env->NewStringUTF(value));

	env->DeleteLocalRef(targetcls);

	env->DeleteLocalRef(refobj);
}

/**
 * 设置Field 布尔值
 */
void setBooleanField(JNIEnv *env, jobject obj, const char *fieldName, bool value)
{
	jobject refobj = env->NewLocalRef(obj);

	jclass targetcls = env->GetObjectClass(refobj);

	jfieldID fieldid = env->GetFieldID(targetcls, fieldName, "Z");

	if(fieldid == NULL)
		return;

	env->SetBooleanField(obj, fieldid, value);

	env->DeleteLocalRef(targetcls);

	env->DeleteLocalRef(refobj);
}

/**
 * 执行返回值为void的方法
 */
void callVoidMethod(JNIEnv *env, jobject obj, const char *methodName, const char *sig, ...)
{
	jobject refobj = env->NewLocalRef(obj);

	jclass targetcls = env->GetObjectClass(refobj);

	jmethodID mid = env->GetMethodID(targetcls, methodName, sig);

	if(mid == NULL){
		return;
	}

	va_list ap;

	va_start(ap, sig);

	env->CallVoidMethodV(refobj, mid, ap);

	va_end(ap);

	env->DeleteLocalRef(targetcls);

	env->DeleteLocalRef(refobj);
}

/**
 * 执行返回值为Object的方法
 */
jobject callJObjectMethod(JNIEnv *env, jobject obj, const char *methodName, const char *sig, ...)
{
	jobject rtn;

	jobject refobj = env->NewLocalRef(obj);

	jclass targetcls = env->GetObjectClass(refobj);

	jmethodID mid = env->GetMethodID(targetcls, methodName, sig);

	if(mid == NULL){
		return NULL;
	}

	va_list ap;

	va_start(ap, sig);

	rtn = env->CallObjectMethodV(refobj, mid, ap);

	va_end(ap);

	env->DeleteLocalRef(targetcls);

	env->DeleteLocalRef(refobj);

	return rtn;
}


/**
 * 设置字段值
 */
void setField(JNIEnv *env, jboolean *hasException, jobject obj, const char *fieldName,  const char *descriptor, const jvalue value)
{
	jobject refobj;

	jclass targetcls;

	jfieldID fieldid;

	//判断本地版本
	if(env->EnsureLocalCapacity(2) != JNI_OK)
	{
		goto error;
	}

	refobj = env->NewLocalRef(obj);

	targetcls = env->GetObjectClass(refobj);

	fieldid = env->GetFieldID(targetcls, fieldName, descriptor);

	if(fieldid == NULL)
		goto error;

	switch(*descriptor){
		case '[':
		case 'L':
			env->SetObjectField(obj, fieldid, (jobject)value.l);
			break;
		case 'Z':
			 env->SetBooleanField(obj, fieldid, (jboolean)value.z);
			break;
		case 'B':
			env->SetByteField(obj, fieldid, (jbyte)value.b);
			break;
		case 'C':
			env->SetCharField(obj, fieldid, (jchar)value.c);
			break;
		case 'S':
			env->SetShortField(obj, fieldid, (jshort)value.s);
			break;
		case 'I':
			env->SetIntField(obj, fieldid, (jint)value.i);
			break;
		case 'J':
			 env->SetLongField(obj, fieldid, (jlong)value.j);
			break;
		case 'F':
			env->SetFloatField(obj, fieldid, (jfloat)value.f);
			break;
		case 'D':
			 env->SetDoubleField(obj, fieldid, (jdouble)value.d);
			break;

		}

	env->DeleteLocalRef(targetcls);

	env->DeleteLocalRef(refobj);

	error:
	if(env->ExceptionOccurred())
		{
			*hasException = env->ExceptionCheck();
//			*hasException = true;
//			env->ExceptionDescribe();
//			env->ExceptionClear();
//			env->ThrowNew(targetcls, "error");
		}
}
 
0
3
分享到:
评论

相关推荐

    Android 深入研究JNI详解

    应用层的Java类是在虚拟机(VM: Vitual Machine)上执行的,而C件不是在VM上执行,那么Java程式又如何要求VM去载入(Load)所指定的C组件呢? 可使用下述指令: System.loadLibrary(*.so的档案名); 例如,Android框架...

    JNI完全技术手册.rar

    JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库...

    黑马程序员JNI学习笔记

    针对所有初学JNI的人员的一个最全面的笔记,对于有过基础的朋友来说又是一个更好的助手. 省去了你自己去总结的时间,有更多的时间去敲代码. ------------黑马程序员学员-------------------

    Java JNI完全手册

     JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。  JAVA通过JNI调用本地方法,而本地方法是以...

    详解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅

    1.首先什么是JNI呢? JNI——(Java Native Interface),他是java平台的特性,不是安卓系统提供的。他定义了一些JNI函数,来让开发者可以通过调用这些函数来实现java代码调用C/C++代码。 2.如何使用JNI呢? 我们先...

    Java_JNI_编程进阶.pdf

    JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它 和本地机器的各种内部联系变得很少,约束了它的功能。解决 JAVA 对本地操作的一种方法就是JNI。JAVA通过JNI调用本地方法,而本地方法是以库...

    Android中使用JNI获得APK签名的哈希值

    本源代码是使用JNI获得APK签名...我们不能够用jni来判断签名是否合法,然后又回到java那里去,只能使用jni来编写核心代码.否则是没有意义的.在判断签名合法时在里面做个标记,每次执行核心代码都判断一下.这样才是安全的.

    Java 调用C/C++程序

    JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。  JAVA通过JNI调用本地方法,而本地方法是以库...

    wolfssljni:wolfSSL用于SSLTLS的JNI包装器和JSSE提供程序,最多支持TLS 1.3!

    该软件包既提供了wolfSSL Java JSSE提供程序( wolfJSSE ),又提供了到本地的基于JNI的精简接口。 这些为Java应用程序提供了SSL / TLS支持,最高支持当前的协议标准。 注1) java.sh脚本将公共位置用于Java安装...

    JNA最新源文件jar包

    使用JNI调用共享类库(.dll/.so文件)是非常麻烦的事情,既需要编写java代码,又要编写C语言的代理方法,这其中需要很多数据类型的转换,是让人非常头痛。JNA框架就是为了解决这些问题和繁琐的事情而开发的,它提供...

    java调用C和C++

    JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。  JAVA通过JNI调用本地方法,而本地方法是以库...

    java调用C/C++全过程

    JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。  JAVA通过JNI调用本地方法,而本地方法是以库...

    关于JVM内存回收算法的补充

    老年代因为空间比较大,存储的对象又是比较长寿的对象,所以采用标记-整理或者也称作标记-压缩算法。这样不必开辟另外50%的空间用于复制目标,也不用担心这个较为辽阔的内存空间产生占用碎片的问题。缺点就是又标记...

    CSTR&Handle Java 客户端.rar

    文章介绍了Android NDK开发的简单概念、常见错误及处理和从第一个Hello World开始实际做一个简单的JNI开发示例,相信看完之后,大家对NDK开发有了一个概念上的认识了,那么接下来我们需要再深入一下NDK的开发,我们...

    基于OpenGLES2.0的Android平台水波纹动态壁纸

    当然这也是从网上各方查来的资料做成的,水波纹效果来自ios,这里不得不又吹下ios的效率要比android高出一大截啊,在同样的网格数量,相近的硬件配置下,iPod touch5跑60fps妥妥的,而魅族mx就有点丢人了,利用jni也...

    OQ100(邮件客户端) v2.5.3.zip

    眼睁睁地看着网站访客来了又走?不要再让网站上的商机白白错过了!即时与访客互动聊天,变流量为销量。 一目了然,监控访客信息。 网站上有多少访客在线、从哪里来的、来过几次、在看什么内容、有没有聊过天等,尽...

    亲试过可以通过cygwin编译发布cocos2d-x几种中文乱码解决方案

    现在的网络情况就是N个网站同一个资源搜来搜去,让人越发焦虑。...自己编译那个iconv好像也难,用jni回调后java转码似乎又违背了跨平台的真正含义。还有好多未知的系统接口调用,如果都这样干,那不如直接实现得了。

    Android调用海康威视SDK实现网络实时播放

    Demo是从项目中扒出来单独写了一下,测试是绝对可用的。...4 targetSdkVersion为10,不能用10以上版本,因为JNI调用发生了改变,海康的SDK又没做处理,会导致错误强退。 有问题可联系邮箱yuliangmax@163.com

    Android系统架构概述PPT

    应用程序框架进一步又分为C/C++和Java两个层次,Java代码运行Dalvik虚拟机之上,并且通过JNI方法和C/C++交互。应用程序层主要就是由四大组件Activity、Service、Broadcast Receiver和Content Provider构成,它们是...

    深入理解Android:卷I--详细书签版

     本书是在分析Android源码的基础上展开的,而源码文件所在的路径一般都很长,例如,文件AndroidRuntime.cpp的真实路径就是framework/base/core/jni/AndroidRuntime.cpp。为了书 写方便起见,我们在各章节开头把该...

Global site tag (gtag.js) - Google Analytics