/**
* 判断对象类型
*/
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");
}
}
分享到:
相关推荐
应用层的Java类是在虚拟机(VM: Vitual Machine)上执行的,而C件不是在VM上执行,那么Java程式又如何要求VM去载入(Load)所指定的C组件呢? 可使用下述指令: System.loadLibrary(*.so的档案名); 例如,Android框架...
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库...
针对所有初学JNI的人员的一个最全面的笔记,对于有过基础的朋友来说又是一个更好的助手. 省去了你自己去总结的时间,有更多的时间去敲代码. ------------黑马程序员学员-------------------
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以...
1.首先什么是JNI呢? JNI——(Java Native Interface),他是java平台的特性,不是安卓系统提供的。他定义了一些JNI函数,来让开发者可以通过调用这些函数来实现java代码调用C/C++代码。 2.如何使用JNI呢? 我们先...
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它 和本地机器的各种内部联系变得很少,约束了它的功能。解决 JAVA 对本地操作的一种方法就是JNI。JAVA通过JNI调用本地方法,而本地方法是以库...
本源代码是使用JNI获得APK签名...我们不能够用jni来判断签名是否合法,然后又回到java那里去,只能使用jni来编写核心代码.否则是没有意义的.在判断签名合法时在里面做个标记,每次执行核心代码都判断一下.这样才是安全的.
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库...
该软件包既提供了wolfSSL Java JSSE提供程序( wolfJSSE ),又提供了到本地的基于JNI的精简接口。 这些为Java应用程序提供了SSL / TLS支持,最高支持当前的协议标准。 注1) java.sh脚本将公共位置用于Java安装...
使用JNI调用共享类库(.dll/.so文件)是非常麻烦的事情,既需要编写java代码,又要编写C语言的代理方法,这其中需要很多数据类型的转换,是让人非常头痛。JNA框架就是为了解决这些问题和繁琐的事情而开发的,它提供...
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库...
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库...
老年代因为空间比较大,存储的对象又是比较长寿的对象,所以采用标记-整理或者也称作标记-压缩算法。这样不必开辟另外50%的空间用于复制目标,也不用担心这个较为辽阔的内存空间产生占用碎片的问题。缺点就是又标记...
文章介绍了Android NDK开发的简单概念、常见错误及处理和从第一个Hello World开始实际做一个简单的JNI开发示例,相信看完之后,大家对NDK开发有了一个概念上的认识了,那么接下来我们需要再深入一下NDK的开发,我们...
当然这也是从网上各方查来的资料做成的,水波纹效果来自ios,这里不得不又吹下ios的效率要比android高出一大截啊,在同样的网格数量,相近的硬件配置下,iPod touch5跑60fps妥妥的,而魅族mx就有点丢人了,利用jni也...
眼睁睁地看着网站访客来了又走?不要再让网站上的商机白白错过了!即时与访客互动聊天,变流量为销量。 一目了然,监控访客信息。 网站上有多少访客在线、从哪里来的、来过几次、在看什么内容、有没有聊过天等,尽...
现在的网络情况就是N个网站同一个资源搜来搜去,让人越发焦虑。...自己编译那个iconv好像也难,用jni回调后java转码似乎又违背了跨平台的真正含义。还有好多未知的系统接口调用,如果都这样干,那不如直接实现得了。
Demo是从项目中扒出来单独写了一下,测试是绝对可用的。...4 targetSdkVersion为10,不能用10以上版本,因为JNI调用发生了改变,海康的SDK又没做处理,会导致错误强退。 有问题可联系邮箱yuliangmax@163.com
应用程序框架进一步又分为C/C++和Java两个层次,Java代码运行Dalvik虚拟机之上,并且通过JNI方法和C/C++交互。应用程序层主要就是由四大组件Activity、Service、Broadcast Receiver和Content Provider构成,它们是...
本书是在分析Android源码的基础上展开的,而源码文件所在的路径一般都很长,例如,文件AndroidRuntime.cpp的真实路径就是framework/base/core/jni/AndroidRuntime.cpp。为了书 写方便起见,我们在各章节开头把该...