当前位置: 首页 > news >正文

东莞做网站哪个公司好采集网站后台客户数据

东莞做网站哪个公司好,采集网站后台客户数据,濮阳百姓网免费发布信息网,页面设计要以什么为导向简单了解一下jni JNI是一个本地编程接口#xff0c;它允许运行在Java虚拟机的Java代码与用其他语言#xff08;如C,C和汇编#xff09;编写的库交互。 jni函数签名 首先看一下java类型对应的jni类型#xff1a; Java类型符号BooleanZByteBCharCShortSIntILongJFloatFDo…简单了解一下jni JNI是一个本地编程接口它允许运行在Java虚拟机的Java代码与用其他语言如C,C和汇编编写的库交互。 jni函数签名 首先看一下java类型对应的jni类型 Java类型符号BooleanZByteBCharCShortSIntILongJFloatFDoubleDVoidV数组[ 比如int[] - [I 如果是二维数组 int[][] - [[Iobjects以L开头以;结尾中间是用/ 隔开的包及类名。比如Ljava/lang/String;如果是嵌套类则用$来表示嵌套。 比如 privite native int test(String arg);则它的签名为 (Ljava/lang/String;)I函数参数的传递 基本类型如整型字符等在Java和native之间是采用值传递Java对象采用的是引用传递 关于局部引用的相关内容可以参考之前的文章 JNI内存方面说明以及相关类型手动释放内存 JavaVM和JNIEnv 这两个结构体在jni.h中有定义 #if defined(__cplusplus) typedef _JNIEnv JNIEnv; typedef _JavaVM JavaVM; #else typedef const struct JNINativeInterface* JNIEnv; typedef const struct JNIInvokeInterface* JavaVM; #endif这里也能看出c版本和c版本在使用调用上有一些不同c相当于又包了一层 下边看一下c的版本 JavaVM struct _JavaVM {const struct JNIInvokeInterface* functions;#if defined(__cplusplus)jint DestroyJavaVM(){ return functions-DestroyJavaVM(this); }jint AttachCurrentThread(JNIEnv** p_env, void* thr_args){ return functions-AttachCurrentThread(this, p_env, thr_args); }jint DetachCurrentThread(){ return functions-DetachCurrentThread(this); }jint GetEnv(void** env, jint version){ return functions-GetEnv(this, env, version); }jint AttachCurrentThreadAsDaemon(JNIEnv** p_env, void* thr_args){ return functions-AttachCurrentThreadAsDaemon(this, p_env, thr_args); } #endif /*__cplusplus*/ };JNIEnv struct _JNIEnv {/* do not rename this; it does not seem to be entirely opaque */const struct JNINativeInterface* functions;#if defined(__cplusplus)jint GetVersion(){ return functions-GetVersion(this); }jclass DefineClass(const char *name, jobject loader, const jbyte* buf,jsize bufLen){ return functions-DefineClass(this, name, loader, buf, bufLen); }jclass FindClass(const char* name){ return functions-FindClass(this, name); }...... } 总的来说 JavaVM是java虚拟机环境每个进程有且只有只有一个。 JNIEnv: 是线程上下文环境每个线程只有一个不能跨线程。 我们可以通过JNIEnv来获取一个JavaVM jint GetJavaVM(JNIEnv *env, JavaVM **vm);// vm用来存放获得的虚拟机的指针的指针。 // return成功返回0失败返回其他。也可以通过JavaVM来获取一个JNIEnv jint GetEnv(void** env, jint version)上边也提到了JNIEnv是线程绑定的所以通常用全局的JavaVM获取一个当前线程的JNIEnv的时候通常需要绑定到当前线程 char thread_name[128] { 0 }; prctl(PR_GET_NAME, (char *)(thread_name)); JavaVMAttachArgs args; args.version JNI_VERSION_1_6; args.name thread_name; args.group NULL; gJvm-AttachCurrentThread(pEnv, (void *)(args))同样的也需要在不使用的时候解绑 gJvm-DetachCurrentThread();本地函数的静态加载和动态加载 所谓静态加载就是我们常见的jni函数的声明是Java_包名_类名_方法名(参数...)这样子的Java方法和本地函数之间的映射关系编译器已经帮我们做了。 下边了解一下动态加载 JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved); JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved);JNI_OnLoad方法是在动态库被加载时调用而JNI_OnUnload则是在本地库被卸载时调用。所以这两个函数就是一个本地库最重要的两个生命周期方法。 在JNI_OnLoad()中就可以手动注册本地函数做好对java方法的映射。 一般的可以这个样子 const JNINativeMethod gMethods[] {{native函数名, native函数签名, (void *)native函数}, //第三个为函数指针...//别的native函数 };JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){JNIEnv *env NULL;jint result -1;if (vm-GetEnv((void **) env, JNI_VERSION_1_6) ! JNI_OK) {return result;}// 动态注册native functionjclass clazz env-FindClass(com.xx.xx.xxclass); env-RegisterNatives(clazz, method, 1) //第三个参数为总的数量// 返回jni的版本return JNI_VERSION_1_6; } 访问字段和函数 对于jni函数中传入的jobject对象要想访问对象的字段和函数就需要先获取对应的class引用 jobject testObject; //假设我们已经有了这么一个对象jclass testCls env-GetObjectClass(testObject); //获取class引用 //int testFiled; //int test(String arg); jfieldID testFiledId env-GetFieldID(testCls, testFiledID, I); jmethodID testMethodId env-GetMethodID(testCls, test, (Ljava/lang/String;)I);// 注意对字段的get/set,函数的调用都必须使用具体的jobject对象而不能是class引用 env-GetIntField(testObjcet, testFiledId); env-CallIntMethod(testObject, testMethodId, arg...);java像Native中的对象的传递一般也是安装上边的方式来进行取出字段的值再赋值给native对应的对象 如果是native的对象回调到java层怎么做 // 先找到class引用 jclass jcs env-FindClass(com/xx/xx/xxclass); // 创建对象有两种方法 // 第一种是调用类的构造函数mthodId就是构造函数的id jmethodID cls_constructor env-GetMethodID(jcs, init, ()V);jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...);// 第二种是直接alloc对象 jobject AllocObject(jclass clazz)//然后将native对象赋值给jobject即可
http://www.w-s-a.com/news/913197/

相关文章:

  • 网站建设记账做什么科目erp系统有哪些软件
  • 泰拳图片做网站用哪里有做空包网站的
  • 查外链网站重庆做网站微信的公司
  • 有没有外包活的网站如何做网站快捷键的元素
  • 公司网站赏析网站制作2019趋势
  • 企业进行网站建设的方式有( )推广引流违法吗
  • 按营销型网站要求重做网站 费用点金网站建设
  • 深圳做网站互联网服务
  • 网站sem托管wordpress安装无法连接数据库
  • 深圳网站建设开发公司哪家好微信小程序商家入口
  • 江门站排名优化建立什么网站赚钱
  • 科普文章在那个网站做招聘网站代做
  • 监控设备东莞网站建设游戏网站域名
  • 对商家而言网站建设的好处网址导航怎么彻底删除
  • app设计网站模板企业展厅策划设计公司有哪些
  • wordpress销售主题手机网站关键词优化
  • 怎么查一个网站是什么程序做的三亚城乡建设局网站
  • 深圳分销网站设计公司做网站一般需要多久
  • 企业网站设计代码丹东seo排名公司
  • 企业网站建设定制开发服务网站建设说课ppt
  • 大连市城乡建设局网站网站免费网站入口
  • 做暧网站网站备案ps
  • 知名网站建设公司电话长子网站建设
  • 网站建设的意义与目的建立什么船籍港
  • 广州注册公司营业执照网站建设代码优化
  • 百度网站官网马克互联网主题 wordpress
  • 网站制作 客户刁难深圳自助建站
  • 怎么去推广一个网站广东餐饮品牌设计
  • 网站代码加密了怎么做兰州最新大事
  • 现在ui做的比较好的网站去年做啥网站致富