/**
* 判断对象类型
*/
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");
}
}
分享到:
相关推荐
JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。...在Android上,使用JNI结合C/C++库进行DES加密解密,既能充分利用底层库的优势,又能确保代码的可移植性。
这在需要利用Java的跨平台特性,同时又需高效地利用C语言底层能力的场景下非常有用。 1. **JNI基础**:JNI是Java平台提供的一种接口,用于连接Java虚拟机(JVM)和本地代码,如C/C++。通过JNI,Java应用程序可以...
线程管理也是JNI编程中必须注意的一个关键点。因为Java虚拟机(JVM)和本地代码可能运行在不同的线程环境中,JNI手册详细地描述了如何正确管理这些线程,包括如何在JNI层面上创建和同步线程。 加载和卸载本地库是...
应用层的 Java 类是在虚拟机(VM:VirtualMachine)上执行的,而 C 组件不是在 VM 上执行,那么 Java 程式又如何要求 VM 去载入(Load)所指定的 C 组件呢?可使用下述指令:System.loadLibrary(*.so 的档案名);...
例如,在处理3G通信时,应用程序层(APP:Phone)通过Java调用framework层的telephony java代码,该代码又通过JNI调用底层的C语言实现,与Linux内核中的PPP协议交互,最终与3G模块通信。 开发JNI和HAL技术涉及的知识...
- `JNIEnv`指针:这是JNI的核心,它是一个结构体指针,包含了调用本地方法所需的函数指针。 - 本地方法声明:在Java类中声明本地方法,使用`native`关键字。 - 动态链接:使用`System.loadLibrary`加载本地库,并...
### JNI-API详细说明 #### 一、概述 Java本地接口(Java Native Interface,简称...通过深入理解JNI的工作原理及其所提供的API,开发者可以更加灵活地利用Java和本地代码的优势,创造出既高效又功能强大的应用程序。
JNILibs.rar是一个压缩包,其中包含了用于Android平台的OpenSSL静态库。OpenSSL是一个开源的库,...在实际开发中,需根据项目需求选择合适的加密算法和协议,遵循最佳实践,以达到既满足功能需求又保证安全性的目标。
- `JNIEnv`指针:这是JNI的核心,它是一个指向一组函数指针的结构体,提供了访问Java对象和执行Java操作的接口。 - `jobject`:这是一个通用类型,表示Java对象,包括类实例、数组、字符串等。 - 类注册:在JNI中...
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库...
总的来说,C++与Java的交互是一个既挑战性又富有成果的领域。理解JVM的工作原理,熟练运用JNI接口,能够极大地拓宽我们的开发能力,使我们能够在不同语言的环境中自由穿梭,实现更高效、更灵活的软件设计。
JNI(Java Native ...这种方式既保留了Java的跨平台性,又能利用C/C++的高性能,为数据安全提供了有效保障。在实际应用中,开发者需要根据具体需求选择合适的加密算法,并确保符合相关安全标准,以防止数据泄露。
这样既利用了C/C++的性能优势,又保证了UI的流畅性。 总的来说,Android中的AsyncTask和JNI是两个互补的技术,AsyncTask负责异步处理和UI更新,而JNI则用于高效地调用原生代码。理解并熟练运用这两者,能够帮助...
这个例子特别适合那些需要利用C/C++的高效性能,同时又需要与Java应用程序集成的开发者。 首先,我们需要理解JNI的基本概念。JNI提供了一套接口,让本地(native)代码能够访问Java虚拟机(JVM),执行Java类的方法...
针对所有初学JNI的人员的一个最全面的笔记,对于有过基础的朋友来说又是一个更好的助手. 省去了你自己去总结的时间,有更多的时间去敲代码. ------------黑马程序员学员-------------------
这一过程确保了JNI的设计既符合学术标准,又满足实际需求。 #### 社区支持与反馈 为了确保JNI的质量和实用性,Sun Microsystems邀请了广泛的社区参与设计讨论,并鼓励用户提出意见和建议。此外,还有一支专门的...
JNI提供了一系列的函数,包括加载本地库、调用本地方法、传递参数等,使得开发者可以编写混合模式的应用,既利用Java的跨平台优势,又能够充分利用本地代码的高效性。 2. **JNI开发流程** - **编写Java代码**:...
总的来说,C++通过JNI与Java的相互调用在Cocos2dx 3.3中是一个关键的集成技术,它使得开发者能够充分利用C++的性能优势,同时又能利用Java的生态系统和Android SDK功能。这个过程需要对C++、Java和Android开发有深入...
JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。...通过深入理解和实践JNI,开发者可以更好地融合Java和C/C++的优点,创建出既高效又灵活的应用程序。