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

发一个本人写的鸡肋的jni代码,你能看出有什么问题吗?

    博客分类:
  • jni
 
阅读更多

/*
 * 执行对象中的方法
 */
jvalue callMethod(JNIEnv *env, jboolean& hasException, jobject obj, const char *methodName, const char *descriptor, ...)
{
//	printf("Method");
	jvalue result;

	jobject refobj;

	jclass targetcls;

	jmethodID mid;

	const char *p = descriptor;

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

	printf("Method11");
	refobj = env->NewLocalRef(obj);
	printf("Method33");
	targetcls = env->GetObjectClass(refobj);
	printf("Method1");
	mid = env->GetMethodID(targetcls, methodName, descriptor);

	if(mid == NULL){
		printf("mid == null");
		env->DeleteLocalRef(targetcls);
		env->DeleteLocalRef(refobj);
		goto error;
	}

	while(*p != ')') p++;

	p++;

	va_list ap;

	va_start(ap, descriptor);
//	printf("Method2");
	switch(*p){
	case 'V':
		env->CallVoidMethodV(refobj, mid, ap);
		break;
	case '[':
	case 'L':
		result.l = env->CallObjectMethodV(refobj, mid, ap);
		break;
	case 'Z':
		result.z = env->CallBooleanMethodV(refobj, mid, ap);
		break;
	case 'B':
		result.b = env->CallByteMethodV(refobj, mid, ap);
		break;
	case 'C':
		result.c = env->CallCharMethodV(refobj, mid, ap);
		break;
	case 'S':
		result.s = env->CallShortMethodV(refobj, mid, ap);
		break;
	case 'I':
		result.i = env->CallIntMethodV(refobj, mid, ap);
		break;
	case 'J':
		result.j = env->CallLongMethodV(refobj, mid, ap);
		break;
	case 'F':
		result.f = env->CallFloatMethodV(refobj, mid, ap);
		break;
	case 'D':
		result.d = env->CallDoubleMethodV(refobj, mid, ap);
		break;

	}

	va_end(ap);
//	printf("Method3");
	env->DeleteLocalRef(targetcls);
	env->DeleteLocalRef(refobj);

	error:
		if(env->ExceptionOccurred())
		{
			printf("Method4");
			hasException = env->ExceptionCheck();
//			env->ExceptionDescribe();
//			env->ExceptionClear();
//			env->ThrowNew(targetcls, "error");
		}
	return result;
}
 
1
1
分享到:
评论

相关推荐

    Android 串口 JNI 代码

    在Android开发中,JNI(Java Native Interface)是一种技术,它允许Java代码和其他语言写的代码进行交互。JNI在Android系统中广泛用于实现性能优化、调用本地库或与硬件设备进行低级别通信,如本例中的串口通信。下面...

    JAVAjni全部代码

    通常,你需要用C/C++编写一个本地库,该库包含读取、写入和修改ini文件的函数。然后,你可以使用JNI来调用这些函数,实现对ini文件的Java接口。 步骤如下: 1. **创建本地方法接口**:在Java类中声明native方法,...

    serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_

    总结来说,`serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_`项目是一个Android应用使用JNI进行串口通信的实例。它涵盖了JNI编程、Android NDK开发、原生代码与Java代码的交互、串口通信协议以及...

    博客JNI相关的测试代码

    Java Native Interface(JNI)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如需要调用操作系统底层功能、优化性能的关键代码或者利用已有的C/C++库。本篇...

    jni代码例子

    JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都发挥着关键作用,比如优化性能、调用操作系统API、使用硬件加速库等。本篇文章将深入探讨JNI...

    Android 打包包含jni代码jar包

    在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他语言写的代码进行交互。JNI在Android中主要用于调用本地(C/C++)代码,以实现性能优化或者利用已有的C/C++库。本教程将围绕如何在...

    jni中用多线程调用java代码

    JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常用于提升性能、调用系统库或者实现特定功能,如与C/C++库交互。本项目重点在于如何在JNI...

    第一个JNI程序

    本教程将带你了解如何创建并运行你的第一个JNI程序,这是一个基本的Android JNI应用实例。 首先,我们需要理解JNI的工作原理。JNI提供了一种方式,让Java代码能够调用本地(native)代码,也就是C/C++代码。这通常...

    java jni c++代码

    Java JNI (Java Native Interface) 是Java平台中一个重要的特性,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下被用到,比如当Java应用程序需要调用已有的C/C++库,或者想要利用硬件的特殊功能时。在...

    jni开发代码

    JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都发挥了关键作用,比如优化性能、调用操作系统原生API、接入硬件设备驱动等。本资料“jni开发...

    Android 2.3截屏JNI代码

    总的来说,使用JNI在Android 2.3中实现截屏是一个涉及到系统底层交互的过程,需要对Android的系统架构、JNI机制以及图像处理有一定的理解。通过这样的方式,开发者可以自定义截图行为,满足特定需求,比如提高效率、...

    JNIDemo代码资源

    在这个名为“JNIDemo”的代码资源中,我们可以看到开发者根据特定的通讯协议——可能是某种硬件设备或系统间通信的协议——编写了一个JNI示例。 JNI的核心概念包括以下几个部分: 1. **本地方法接口(Native ...

    Android中JNI实现AES加密源代码

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI常用于提高应用程序性能,访问特定硬件功能,或者像本例中所示,执行安全操作,如AES加密。AES...

    JNi调用c++写本地文件小例子

    Java Native Interface(JNI)是Java平台提供的一种标准方式,允许Java代码和其他语言写的代码进行交互。这个例子展示了如何使用JNI来调用C++代码,在Java环境中执行本地文件的写入操作。下面我们将深入探讨这个过程...

    jni.zip jni编译jni下载

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C或C++库,或者提升性能时,我们可以通过JNI将Java代码与本地...

    第一个JNI实例学习

    JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都发挥着关键作用,比如优化性能、调用操作系统API、接入硬件设备、使用C/C++库等。在这个"第一...

    NDK JNI开发例子代码2

    例如,你可能会看到一个名为`JniDemoActivity`的类,其中有一个`native void callNativeMethod();`的方法声明。Java代码会通过`System.loadLibrary("JniDemo")`来加载本地库。 4. **C/C++源码**:在jni目录下,你会...

    动态注册JNI方法写hello jni

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言写的代码进行交互。JNI在很多场景下都非常有用,比如优化性能、调用系统库或者使用第三方C/C++库等。本教程将通过一个...

    Android JNI示例代码

    在Android开发中,Java Native Interface (JNI) 是一个至关重要的技术,它允许Java代码与本地(C/C++)代码交互。JNI在很多场景下都扮演着关键角色,比如提升性能、利用硬件加速、调用已有的C库或者实现低级别操作。...

Global site tag (gtag.js) - Google Analytics