`
yangzc106
  • 浏览: 156421 次
  • 性别: 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
分享到:
评论

相关推荐

    jni des加密解密实现

    JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。...在Android上,使用JNI结合C/C++库进行DES加密解密,既能充分利用底层库的优势,又能确保代码的可移植性。

    jni-util.zip

    这在需要利用Java的跨平台特性,同时又需高效地利用C语言底层能力的场景下非常有用。 1. **JNI基础**:JNI是Java平台提供的一种接口,用于连接Java虚拟机(JVM)和本地代码,如C/C++。通过JNI,Java应用程序可以...

    JNI 完整高清手册(英文版)

    线程管理也是JNI编程中必须注意的一个关键点。因为Java虚拟机(JVM)和本地代码可能运行在不同的线程环境中,JNI手册详细地描述了如何正确管理这些线程,包括如何在JNI层面上创建和同步线程。 加载和卸载本地库是...

    Android深入研究JNI详解.pdf

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

    Android下JNI和HAL技术

    例如,在处理3G通信时,应用程序层(APP:Phone)通过Java调用framework层的telephony java代码,该代码又通过JNI调用底层的C语言实现,与Linux内核中的PPP协议交互,最终与3G模块通信。 开发JNI和HAL技术涉及的知识...

    JNI完全手册

    - `JNIEnv`指针:这是JNI的核心,它是一个结构体指针,包含了调用本地方法所需的函数指针。 - 本地方法声明:在Java类中声明本地方法,使用`native`关键字。 - 动态链接:使用`System.loadLibrary`加载本地库,并...

    JNI-API详细说明

    ### JNI-API详细说明 #### 一、概述 Java本地接口(Java Native Interface,简称...通过深入理解JNI的工作原理及其所提供的API,开发者可以更加灵活地利用Java和本地代码的优势,创造出既高效又功能强大的应用程序。

    jniLibs.rar

    JNILibs.rar是一个压缩包,其中包含了用于Android平台的OpenSSL静态库。OpenSSL是一个开源的库,...在实际开发中,需根据项目需求选择合适的加密算法和协议,遵循最佳实践,以达到既满足功能需求又保证安全性的目标。

    java jni教程

    - `JNIEnv`指针:这是JNI的核心,它是一个指向一组函数指针的结构体,提供了访问Java对象和执行Java操作的接口。 - `jobject`:这是一个通用类型,表示Java对象,包括类实例、数组、字符串等。 - 类注册:在JNI中...

    JNI完全技术手册.rar

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

    使用C++创建java虚拟机JVM,使用JNI调用java函数.zip

    总的来说,C++与Java的交互是一个既挑战性又富有成果的领域。理解JVM的工作原理,熟练运用JNI接口,能够极大地拓宽我们的开发能力,使我们能够在不同语言的环境中自由穿梭,实现更高效、更灵活的软件设计。

    JNI加密例子

    JNI(Java Native ...这种方式既保留了Java的跨平台性,又能利用C/C++的高性能,为数据安全提供了有效保障。在实际应用中,开发者需要根据具体需求选择合适的加密算法,并确保符合相关安全标准,以防止数据泄露。

    android中AsyncTask和jni技术简单应用--附案例附代码

    这样既利用了C/C++的性能优势,又保证了UI的流畅性。 总的来说,Android中的AsyncTask和JNI是两个互补的技术,AsyncTask负责异步处理和UI更新,而JNI则用于高效地调用原生代码。理解并熟练运用这两者,能够帮助...

    JNI中C调用Java方法的实例

    这个例子特别适合那些需要利用C/C++的高效性能,同时又需要与Java应用程序集成的开发者。 首先,我们需要理解JNI的基本概念。JNI提供了一套接口,让本地(native)代码能够访问Java虚拟机(JVM),执行Java类的方法...

    黑马程序员JNI学习笔记

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

    Java本地接口(JNI)编程指南和规范.pdf

    这一过程确保了JNI的设计既符合学术标准,又满足实际需求。 #### 社区支持与反馈 为了确保JNI的质量和实用性,Sun Microsystems邀请了广泛的社区参与设计讨论,并鼓励用户提出意见和建议。此外,还有一支专门的...

    jni开发的Demo

    JNI提供了一系列的函数,包括加载本地库、调用本地方法、传递参数等,使得开发者可以编写混合模式的应用,既利用Java的跨平台优势,又能够充分利用本地代码的高效性。 2. **JNI开发流程** - **编写Java代码**:...

    cocos2dx 3.3工程,C++通过JNI与Java相互调用

    总的来说,C++通过JNI与Java的相互调用在Cocos2dx 3.3中是一个关键的集成技术,它使得开发者能够充分利用C++的性能优势,同时又能利用Java的生态系统和Android SDK功能。这个过程需要对C++、Java和Android开发有深入...

    JniDemo.zip

    JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。...通过深入理解和实践JNI,开发者可以更好地融合Java和C/C++的优点,创建出既高效又灵活的应用程序。

Global site tag (gtag.js) - Google Analytics