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

电子商务网站设计模板网站设计需求模板

电子商务网站设计模板,网站设计需求模板,平台如何做推广,工商公示系统查询入口JNI(Java Native Interface)提供一种Java字节码调用C/C的解决方案#xff0c;JNI描述的是一种技术。NDK(Native Development Kit)Android NDK 是一组允许您将 C 或 C(“原生代码”)嵌入到 Android 应用中的工具#xff0c;NDK描述的是工具集。 能够在 Android 应用中使用原生…JNI(Java Native Interface)提供一种Java字节码调用C/C的解决方案JNI描述的是一种技术。NDK(Native Development Kit)Android NDK 是一组允许您将 C 或 C(“原生代码”)嵌入到 Android 应用中的工具NDK描述的是工具集。 能够在 Android 应用中使用原生代码对于想执行以下一项或多项操作的开发者特别有用在平台之间移植其应用。重复使用现有库或者提供其自己的库供重复使用。在某些情况下提高性能特别是像游戏这种计算密集型应用。JNI方法注册静态注册当Java层调用navtie函数时会在JNI库中根据函数名查找对应的JNI函数。如果没找到会报错。如果找到了则会在native函数与JNI函数之间建立关联关系其实就是保存JNI函数的函数指针。下次再调用native函数就可以直接使用这个函数指针。JNI函数名格式(需将”.”改为”_”)Java_ 包名(com.example.auto.jnitest) 类名(MainActivity) 函数名(stringFromJNI)静态方法的缺点要求JNI函数的名字必须遵循JNI规范的命名格式名字冗长容易出错初次调用会根据函数名去搜索JNI中对应的函数会影响执行效率需要编译所有声明了native函数的Java类每个所生成的class文件都要用javah工具生成一个头文件动态注册通过提供一个函数映射表注册给JVM虚拟机这样JVM就可以用函数映射表来调用相应的函数就不必通过函数名来查找需要调用的函数。Java与JNI通过JNINativeMethod的结构来建立函数映射表它在jni.h头文件中定义其结构内容如下typedef struct {const char* name;const char* signature;void* fnPtr;} JNINativeMethod;创建映射表后调用RegisterNatives函数将映射表注册给JVM;当Java层通过System.loadLibrary加载JNI库时会在库中查JNI_OnLoad函数。可将JNI_OnLoad视为JNI库的入口函数需要在这里完成所有函数映射和动态注册工作及其他一些初始化工作。数据类型转换基础数据类型转换引用数据类型转换除了Class、String、Throwable和基本数据类型的数组外其余所有Java对象的数据类型在JNI中都用jobject表示。Java中的String也是引用类型但是由于使用频率较高所以在JNI中单独创建了一个jstring类型。引用类型不能直接在 Native 层使用需要根据 JNI 函数进行类型的转化后才能使用;多维数组(含二维数组)都是引用类型需要使用 jobjectArray 类型存取其值例如二维整型数组就是指向一位数组的数组其声明使用方式如下//获得一维数组的类引用即jintArray类型jclass intArrayClass env-FindClass([I);//构造一个指向jintArray类一维数组的对象数组该对象数组初始大小为length类型为 jsizejobjectArray obejctIntArray env-NewObjectArray(length ,intArrayClass , NULL);JNI函数签名信息由于Java支持函数重载因此仅仅根据函数名是没法找到对应的JNI函数。为了解决这个问题JNI将参数类型和返回值类型作为函数的签名信息。JNI规范定义的函数签名信息格式(参数1类型字符…)返回值类型字符函数签名例子:JNI常用的数据类型及对应字符:JNIEnv介绍JNIEnv概念 :JNIEnv是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境。通过JNIEnv可以调用到一系列JNI系统函数。JNIEnv线程相关性每个线程中都有一个 JNIEnv 指针。JNIEnv只在其所在线程有效, 它不能在线程之间进行传递。注意在C创建的子线程中获取JNIEnv要通过调用JavaVM的AttachCurrentThread函数获得。在子线程退出时要调用JavaVM的DetachCurrentThread函数来释放对应的资源否则会出错。JNIEnv 作用访问Java成员变量和成员方法调用Java构造方法创建Java对象等。JNI编译ndkBuildCmake编译CMake 则是一个跨平台的编译工具它并不会直接编译出对象而是根据自定义的语言规则(CMakeLists.txt)生成 对应 makefile 或 project 文件然后再调用底层的编译 在Android Studio 2.2 之后支持Cmake编译。add_library 指令语法add_library(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] [source])将一组源文件 source 编译出一个库文件并保存为 libname.so (lib 前缀是生成文件时 CMake自动添加上去的)。其中有三种库文件类型不写的话默认为 STATIC;SHARED: 表示动态库可以在(Java)代码中使用 System.loadLibrary(name) 动态调用STATIC: 表示静态库集成到代码中会在编译时调用MODULE: 只有在使用 dyId 的系统有效如果不支持 dyId则被当作 SHARED 对待EXCLUDE_FROM_ALL: 表示这个库不被默认构建除非其他组件依赖或手工构建;#将compress.c 编译成 libcompress.so 的共享库add_library(compress SHARED compress.c)target_link_libraries 指令语法target_link_libraries(target library library2…)这个指令可以用来为 target 添加需要的链接的共享库同样也可以用于为自己编写的共享库添加共享库链接。如#指定 compress 工程需要用到 libjpeg 库和 log 库target_link_libraries(compress libjpeg ${log-lib})find_library 指令语法find_library( name1 path1 path2 ...)VAR 变量表示找到的库全路径包含库文件名 。例如find_library(libX X11 /usr/lib)find_library(log-lib log) #路径为空应该是查找系统环境变量路径Abi架构ABI(Application binary interface)应用程序二进制接口。不同的CPU 与指令集的每种组合都有定义的 ABI (应用程序二进制接口)一段程序只有遵循这个接口规范才能在该 CPU 上运行所以同样的程序代码为了兼容多个不同的CPU需要为不同的 ABI 构建不同的库文件。当然对于CPU来说不同的架构并不意味着一定互不兼容。armeabi设备只兼容armeabiarmeabi-v7a设备兼容armeabi-v7a、armeabiarm64-v8a设备兼容arm64-v8a、armeabi-v7a、armeabiX86设备兼容X86、armeabiX86_64设备兼容X86_64、X86、armeabimips64设备兼容mips64、mipsmips只兼容mips根据以上的兼容总结我们还可以得到一些规律armeabi的SO文件基本上可以说是万金油它能运行在除了mips和mips64的设备上但在非armeabi设备上运行性能还是有所损耗64位的CPU架构总能向下兼容其对应的32位指令集如x86_64兼容X86arm64-v8a兼容armeabi-v7amips64兼容mips问题排查 addr2line03-21 23:59:32.032 6770-6770/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***03-21 23:59:32.032 6770-6770/? A/DEBUG: Build fingerprint: google/sdk_gphone_x86/generic_x86:8.1.0/OPM1.171004.001/4376136:user/release-keys03-21 23:59:32.032 6770-6770/? A/DEBUG: Revision: 003-21 23:59:32.032 6770-6770/? A/DEBUG: ABI: x8603-21 23:59:32.032 6770-6770/? A/DEBUG: pid: 6745, tid: 6745, name: ucai.nativedemo com.choufucai.nativedemo 03-21 23:59:32.032 6770-6770/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x7003-21 23:59:32.032 6770-6770/? A/DEBUG: Cause: null pointer dereference03-21 23:59:32.032 6770-6770/? A/DEBUG: eax 00000070 ebx a8a6479c ecx 00000035 edx 0000007503-21 23:59:32.032 6770-6770/? A/DEBUG: esi ffffffff edi ffffffff03-21 23:59:32.032 6770-6770/? A/DEBUG: xcs 00000073 xds 0000007b xes 0000007b xfs 0000003b xss 0000007b03-21 23:59:32.032 6770-6770/? A/DEBUG: eip a89a2553 ebp bffa2408 esp bffa1e78 flags 0001020203-21 23:59:32.228 6770-6770/? A/DEBUG: backtrace:03-21 23:59:32.228 6770-6770/? A/DEBUG: #00 pc 0001d553 /system/lib/libc.so (strlen51)03-21 23:59:32.228 6770-6770/? A/DEBUG: #01 pc 0005fd5d /system/lib/libc.so (__vfprintf5581)03-21 23:59:32.228 6770-6770/? A/DEBUG: #02 pc 0008439e /system/lib/libc.so (vsnprintf222)03-21 23:59:32.228 6770-6770/? A/DEBUG: #03 pc 00022f30 /system/lib/libc.so (__vsnprintf_chk48)03-21 23:59:32.228 6770-6770/? A/DEBUG: #04 pc 000068de /system/lib/liblog.so (__android_log_print78)03-21 23:59:32.228 6770-6770/? A/DEBUG: #05 pc 00000ee2 /data/app/com.choufucai.nativedemo-c_F0BwkNYJA0ITdueTXEdg/lib/x86/libnative-lib.so03-21 23:59:32.228 6770-6770/? A/DEBUG: #06 pc 00647e67 /system/lib/libart.so (art_quick_generic_jni_trampoline71)03-21 23:59:32.228 6770-6770/? A/DEBUG: #07 pc 00641e62 /system/lib/libart.so (art_quick_invoke_stub338)03-21 23:59:32.228 6770-6770/? A/DEBUG: #08 pc 00115fdf /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)223)03-21 23:59:32.228 6770-6770/? A/DEBUG: #09 pc 0032143f /system/lib/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)335)03-21 23:59:32.228 6770-6770/? A/DEBUG: #10 pc 0031a6a4 /system/lib/libart.so以上错误日志中backtrace就是堆栈信息#00 #01 就是堆栈列表。 #00 就是堆栈顶层即是错误所在地址pc后面的就是地址可以通过以下命令查找出地址可以获得对应的源码文件和行号// -f 输出函数名// -e 输出错误代码行数和文件路径// xxx.so 对应出错的so文件, 在android工程obj目录下// addr 是具体的地址arm-linux-androideabi-addr2line -f -e xxx.so addr
http://www.zqtcl.cn/news/200538/

相关文章:

  • 巴中建设厅网站电话seo是网络优化吗
  • 中国做投资的网站做网站的公司怎么推广
  • 专业的广州微网站建设移动应用开发干什么的
  • 网站运营有什么用常熟智能网站开发
  • 如何组建做网站的团队绍兴网站建设推广
  • 资讯类响应式网站模板深圳网站建设培训机构
  • 电子商务网站功能设计3d动画制作过程
  • 随机网站生成器win7asp+sql server 2008做网站
  • 金本网站建设设计江苏建筑业网
  • 校园网站建设的作用淄博网站建设网站推广优化
  • 域名过期了怎么办怎么找回网站校友录网站开发设计
  • 医疗 企业 网站建设seo网络优化是什么工作
  • e时代速递搜索引擎网站建设aso关键词搜索优化
  • 产品单页营销型网站模板龙华网站建设深圳信科
  • 建网站平台要多少钱投资公司取名字大全
  • 建设网站需要哪些设备重庆本地建站
  • 学做家常菜去那个网站专业制作网站制作
  • 合肥网站建设公网站程序如何上传
  • 潍坊网站建设招聘官方网站建设 在线磐石网络
  • 校友网站建设开一个网站的流程
  • 商业门户网站是什么意思哪家培训机构学校好
  • 青岛企业网站制作seo排名优化培训网站
  • 2018做网站还是app上海搜索seo
  • 网站建设用模板好吗罗湖网站制作费用
  • 网站图片延时加载app推广视频
  • 郑州设计师网站个人搭建网站要多少钱
  • 网站制作成品下载wordpress怎么更改样式
  • 河北省城乡和建设厅网站首页网站维护属于什么部门
  • 西安建网站公司哪家好网站导航条设计欣赏
  • 张家港网站网络优化济南网站建设0531soso