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

如何做天猫网站网站建设和商城有什么好处

如何做天猫网站,网站建设和商城有什么好处,网页设计作业10个页面,昆明网站建设 网络服务一、JNI#xff08;Java Native Interface#xff09; 1、什么是JNI#xff1a;JNI(Java Native Interface):java本地开发接口JNI是一个协议#xff0c;这个协议用来沟通java代码和外部的本地代码(c/c) 外部的c/c代码也可以调用java代码2、为什么使用JNI#xff1a;效率上…一、JNIJava Native Interface        1、什么是JNI               JNI(Java Native Interface):java本地开发接口               JNI是一个协议这个协议用来沟通java代码和外部的本地代码(c/c)               外部的c/c代码也可以调用java代码        2、为什么使用JNI               效率上 C/C是本地语言比java更高效               代码移植如果之前用C语言开发过模块可以复用已经存在的c代码               java反编译比C语言容易一般加密算法都是用C语言编写不容易被反编译        3、Java基本数据类型与C语言基本数据类型的对应                       3、引用类型对应                       4、堆内存和栈内存的概念               栈内存系统自动分配和释放                       保存全局、静态、局部变量                       在站上分配内存叫静态分配                       大小一般是固定的               堆内存程序员手动分配(malloc/new)和释放(free/java不用手动释放由GC回收)                       在堆上分配内存叫动态分配                       一般硬件内存有多大堆内存就有多大 二、交叉编译        1、交叉编译的概念           交叉编译即在一个平台编译出另一个平台能够执行的二进制代码           主流平台有 Windows、 Mac os、 Linux           主流处理器 x86、 arm、 mips        2、交叉编译的原理           即在一个平台上模拟其他平台的特性           编译的流程 源代码--编译--链接--可执行程序        3、交叉编译的工具链           多个工具的集合一个工具使用完后接着调用下一个工具        4、常见的交叉编译工具           NDK(Native Development Kit): 开发JNI必备工具就是模拟其他平台特性类编译代码的工具           CDT(C/C Development Tools): 是Eclipse开发C语言的一个插件高亮显示C语言的语法           Cygwin: 一个Windows平台的Unix模拟器可以参考之前博客Cygwin简介及使用        5、NDK的目录结构可以在Google官网下载NDK开发工具需要FQ           docs: 帮助文档           build/toolslinux的批处理文件           platforms编译c代码需要使用的头文件和类库           prebuilt预编译使用的二进制可执行文件           samplejni的使用例子           sourcendk的源码           toolchains工具链           ndk-build.cmd:编译打包c代码的一个指令需要配置系统环境变量 三、JNI的第一个例子           好了准备知识已经完毕下面开始我们的一个JNI例子。         1、新建一个Android项目在根目录下创建 jni文件夹用于存放 C源码。         2、在java代码中创建一个本地方法 getStringFromC 本地方法没有方法体。 private native String getStringFromC();         3、在jni中创建一个C文件定义一个函数实现本地方法函数名必须用使用 本地方法的全类名点改为下划线。 1 #include stdio.h2 #include stdlib.h3 #include jni.h4 //方法名必须为本地方法的全类名点改为下划线穿入的两个参数必须这样写 5 //第一个参数为Java虚拟机的内存地址的二级指针用于本地方法与java虚拟机在内存中交互 6 //第二个参数为一个java对象即是哪个对象调用了这个 c方法 7 jstring Java_com_mwp_jnihelloworld_MainActivity_getStringFromC(JNIEnv* env, 8 jobject obj){ 9 //定义一个C语言字符串 10 char* cstr hello form c; 11 //返回值是java字符串所以要将C语言的字符串转换成java的字符串 12 //在jni.h 中定义了字符串转换函数的函数指针 13 //jstring (*NewStringUTF)(JNIEnv*, const char*); 14 //第一种方法很少用 15 jstring jstr1 (*(*env)).NewStringUTF(env, cstr); 16 //第二种方法推荐 17 jstring jstr2 (*env) - NewStringUTF(env, cstr); 18 return jstr2; 19 }         4、在jni中创建 Android.mk文件用于配置 本地方法 LOCAL_PATH : $(call my-dir)include $(CLEAR_VARS)#编译生成的文件的类库叫什么名字LOCAL_MODULE : hello#要编译的c文件LOCAL_SRC_FILES : Hello.cinclude $(BUILD_SHARED_LIBRARY)          5、在jni目录下执行 ndk-build.cmd指令编译c文件          6、在java代码中加载编译后生成的so类库调用本地方法将项目部署到虚拟机上之后就会发现toast弹出的C代码定义的字符串第一个例子执行成功了。 static{//加载打包完毕的 so类库System.loadLibrary(hello);}          7、jni打包的C语言类库默认仅支持 arm架构需要在jni目录下创建 Android.mk 文件添加如下代码可以支持x86架构 APP_ABI : armeabi armeabi-v7a x86 四、JNI常见错误          1、findLibrary returned null:                 CPU平台不匹配 或者 在加载类库时类库名字写错了          2、本地方法找不到                 忘记加载类库了 或者 C代码中方法名写错了     五、javah工具与javap工具          1、javah:  生成本地方法头文件             需要在C/C模块下才能生效             在JDK1.7中在src目录下执行javah 全类名             在JDK1.6中在bin/classes目录下执行          2、javap:  打印方法签名             在C语言中调用java的方法需要用到反射C语言的反射需要一个方法签名使用javap能够生成方法签名很熟练的话也可以自己写方法签名             在bin/classes目录下执行 javap -s 全类名              六、使用本地方法加密字符串的一个小例子       C语言字符串与Java中的字符串类型不同所以需要进行字符串类型转换。       一个重要的思想C语言计算字符串的长度不方便但是java很方便只需要调用一个length()方法就可以所以像这种需求那个语言有优势就用哪个语言算算完当做参数传递给另一种语言就ok。                       混合语言编程这应该是一种非常有用的思想。      Java非常容易被反编译所以加密都是用 c语言写的 #include jni.h #include string.h //将java字符串转换为c语言字符串工具方法 char* Jstring2CStr(JNIEnv* env, jstring jstr) {char* rtn NULL; jclass clsstring (*env)-FindClass(env,java/lang/String); jstring strencode (*env)-NewStringUTF(env,GB2312); jmethodID mid (*env)-GetMethodID(env,clsstring, getBytes, (Ljava/lang/String;)[B); jbyteArray barr (jbyteArray)(*env)-CallObjectMethod(env,jstr,mid,strencode); // String .getByte(GB2312); jsize alen (*env)-GetArrayLength(env,barr); jbyte* ba (*env)-GetByteArrayElements(env,barr,JNI_FALSE); if(alen 0) { rtn (char*)malloc(alen1); //\0 memcpy(rtn,ba,alen); rtn[alen]0; } (*env)-ReleaseByteArrayElements(env,barr,ba,0); // return rtn; } JNIEXPORT jstring JNICALL Java_com_mwp_encodeanddecode_MainActivity_encode (JNIEnv * env, jobject obj, jstring text, jint length){ char* cstr Jstring2CStr(env, text); int i; for(i 0;ilength;i){ *(cstri) 1; //加密算法将字符串每个字符加1 } return (*env)-NewStringUTF(env,cstr); } JNIEXPORT jstring JNICALL Java_com_mwp_encodeanddecode_MainActivity_decode (JNIEnv * env, jobject obj, jstring text, jint length){ char* cstr Jstring2CStr(env, text); int i; for(i 0;ilength;i){ *(cstri) - 1; } return (*env)-NewStringUTF(env, cstr); }   七、JNI操作一个数组引用传递           传递数组其实是传递一个堆内存的数组首地址的引用过去所以实际操作的是同一块内存           当调用完方法不需要返回值,实际上参数内容已经改变           Android中很多操作硬件的方法都是这种C语言的传引用的思路 1 public class MainActivity extends Activity {2 3 static{ 4 System.loadLibrary(encode); 5 } 6 int[] array {1,2,3,4,5}; 7 Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_main); 11 } 12 13 public void click(View v){ 14 encodeArray(array); 15 //不需要返回值实际操作的是同一块内存内容已经发生了改变 16 for (int i : array) { 17 System.out.println(i); 18 } 19 } 20 21 //传递数组其实是传递一个堆内存的数组首地址的引用过去所以实际操作的是同一块内存 22 //当调用完方法不需要返回值,实际上参数内容已经改变 23 //Android中很多操作硬件的方法都是这种C语言的传引用的思路要非常熟练 24 private native void encodeArray(int[] arr); 25 }   1 #include jni.h2 /*3 * Class: com_mwp_jniarray_MainActivity4 * Method: encodeArray 5 * Signature: ([I)V 6 */ 7 JNIEXPORT void JNICALL Java_com_mwp_jniarray_MainActivity_encodeArray 8 (JNIEnv * env, jobject obj, jintArray arr){ 9 //拿到整型数组的长度以及第0个元素的地址 10 //jsize (*GetArrayLength)(JNIEnv*, jarray); 11 int length (*env)-GetArrayLength(env, arr); 12 // jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*); 13 int* arrp (*env)-GetIntArrayElements(env, arr, 0); 14 int i; 15 for(i 0;ilength;i){ 16 *(arrp i) 10; //将数组中的每个元素加10 17 } 18 }   八、偷用美图秀秀的C语言本地类库加深JNI的理解     项目中不需要有c代码只需要有一个编译过后的类库供Java调用就可以了。     将美图秀秀的apk文件解压缩将lib目录下C类库导入自己的项目     反编译美图秀秀的apk文件将其本地方法类 JNI.java复制到自己的项目     根据本地方法名和参数猜函数的作用及如何使用     下例调用了美图的一个LOMO美化效果 1 public class MainActivity extends Activity {2 3 static{ 4 //加载美图秀秀的类库 5 System.loadLibrary(mtimage-jni); 6 } 7 private ImageView iv; 8 private Bitmap bitmap; 9 Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 14 iv (ImageView) findViewById(R.id.iv); 15 16 bitmap BitmapFactory.decodeFile(sdcard/aneiyi.jpg); 17 iv.setImageBitmap(bitmap); 18 } 19 20 public void click(View v){ 21 22 int width bitmap.getWidth(); 23 int height bitmap.getHeight(); 24 25 //用于保存所有像素信息的数组 26 int[] pixels new int[width*height]; 27 //获取图片的像素颜色信息保存至pixels 28 bitmap.getPixels(pixels, 0, width, 0, 0, width, height); 29 30 JNI jni new JNI(); 31 //调用美图秀秀本地库中的美图方法靠猜 32 //arg0:保存了所有像素颜色信息的数组 33 //arg1:图片的宽 34 //arg2:图片的高 35 //此方法是通过改变pixels的像素颜色值来实现美化效果传递一个数组参数是不需要返回值的 36 jni.StyleLomoB(pixels, width, height); 37 38 Bitmap bmNew Bitmap.createBitmap(pixels, width, height, bitmap.getConfig()); 39 iv.setImageBitmap(bmNew); 40 } 41 }   九、在C语言中调用java方法反射         1、有时需要在C语言中调用java的方法如刷新UI显示加载资源进度            在本地方法C语言代码中打印 Android的Logcat日志输出Google已经帮我们封装好了方法只需要调用一下就可以            如果要输出中文的话必须将C语言的文件编码改成 utf-8,否则乱码            在C语言中调用java的方法需要用到反射C语言的反射需要一个方法签名使用javap能够生成方法签名很熟练的话也可以自己写方法签名            在bin/classes目录下执行 javap -s 全类名 1 public class MainActivity extends Activity {2 static{ 3 System.loadLibrary(hello); 4 } 5 6 Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 } 11 12 public void click(View v){ 13 cLog(); 14 } 15 16 public native void cLog(); 17 18 public void show(String message){ 19 Builder builder new Builder(this); 20 builder.setTitle(标题); 21 builder.setMessage(message); 22 builder.show(); 23 } 24 25 } #include jni.h #include android/log.h #define LOG_TAG System.out #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) JNIEXPORT void JNICALL Java_com_mwp_ccalljava2_MainActivity_cLog (JNIEnv * env, jobject obj){ //打印log输出 LOGD(我是C语言打印的debug日志); LOGI(我是C语言打印的info日志); //通过反射来调用java的方法需要知道方法签名使用javap得到方法签名 //在bin/classes目录下执行 javap -s 全类名 //1、得到类的字节码对象 //jclass (*FindClass)(JNIEnv*, const char*); jclass clazz (*env)-FindClass(env, com/mwp/ccalljava2/MainActivity); //jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*); jmethodID methodID (*env)-GetMethodID(env, clazz, show, (Ljava/lang/String;)V); //void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); (*env)-CallVoidMethod(env,obj,methodID, (*env)-NewStringUTF(env, 这是弹窗的内容)); } LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS -llog LOCAL_MODULE : hello LOCAL_SRC_FILES : log.c include $(BUILD_SHARED_LIBRARY) 十、模拟监测压力传感器         传感器的原理是使用敏感电阻如光敏电阻热敏电阻等监测电流电压的变化         Android程序只需要处理传感器传递的数据并将其显示在界面上就可以。         下面模拟一个压力传感器来练习JNI编程 1 public class MainActivity extends Activity {2 static{ 3 System.loadLibrary(monitor); 4 } 5 private MyProgressBar mpb; 6 Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 11 mpb (MyProgressBar) findViewById(R.id.mpb); 12 mpb.setMax(100); 13 } 14 15 public void start(View v){ 16 new Thread(){ 17 public void run() { 18 startMonitor(); 19 }; 20 }.start(); 21 } 22 23 public void stop(View v){ 24 stopMonitor(); 25 } 26 27 public native void startMonitor(); 28 public native void stopMonitor(); 29 30 //供本地方法调用刷新UI 31 public void show(int pressure){ 32 mpb.setPressure(pressure); 33 } 34 } #include jni.h #include stdio.h #include stdlib.h //模拟压力传感其传递数据 int getPressure(){ return rand()%101; } //用于控制循环的开关 int monitor; JNIEXPORT void JNICALL Java_com_mwp_monitor_MainActivity_startMonitor (JNIEnv * env, jobject obj){ monitor 1; int pressure; jclass clazz; jmethodID methodid; while(monitor){ //本地方法获取传感器数据 pressure getPressure(); //使用反射调用java方法刷新界面显示 //jclass (*FindClass)(JNIEnv*, const char*); clazz (*env)-FindClass(env, com/mwp/monitor/MainActivity); //jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*); methodid (*env)-GetMethodID(env, clazz, show,(I)V); // void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); (*env)-CallVoidMethod(env, obj, methodid, pressure); sleep(1); } } JNIEXPORT void JNICALL Java_com_mwp_monitor_MainActivity_stopMonitor (JNIEnv * env, jobject obj){ //结束循环 monitor 0; }   十一、使用C代码实现本地方法          1、把c文件后缀名换成cpp          2、Android.mk文件中的hello.c也要换成hello.cpp          3、c的使用的环境变量结构体中访问了c使用的结构体的函数指针函数名全部都是一样的只是参数去掉了结构体指针          4、访问函数指针时把env前面的*号去掉因为此时env已经是一级指针          5、clean清除之前编译的残留文件          6、把声明函数的h文件放入jni文件夹中include该h文 #include jni.h #include com_mwp_cplusplus_MainActivity.h JNIEXPORT jstring JNICALL Java_com_mwp_cplusplus_MainActivity_helloC(JNIEnv * env, jobject obj){ char* cstr hello from c; //return (*env)-NewStringUTF(env, cstr); return env-NewStringUTF(cstr); }
http://www.sadfv.cn/news/380551/

相关文章:

  • 中国铁建华南建设有限公司网站网站关键词优化原理
  • 自建网站经营者例子青羊建站报价
  • 老外做摄影网站花多少钱课程网站建设课程
  • 做网站的学校杭州洛可可设计公司
  • 网站聊天系统怎么做免费咨询心理医生 在线
  • 网站建设代理怎么做吴江高端网站建设
  • 摄影照片投稿网站红古微信网站建设
  • 网站建设明细报价表仅供参考政务网站建设规范
  • 山西钢铁建设集团有限公司网站昆网站在哪里
  • 沈阳做网站有名公司麻花视频2020
  • 大型网站开发的书有了域名与服务器怎么建网站
  • 做外贸一般看什么网站中文网页开发工具
  • 网站开发与设计实训实训报告seo 优化教程
  • 做网站市场分析网站项目规划与设计方案
  • 网站可以做多语言的吗百度写一篇文章多少钱
  • 汕头论坛建站模板高级感ppt模板
  • 怎么给自己制作一个网站软件定制开发公司发展前景
  • 成华区微信网站建设公免费网站app软件
  • 个人网站网址有哪些做淘宝那样的网站麻烦吗
  • 做外贸怎么进入国外的网站制作企业网站的新闻
  • 蚌埠网站制作哪里有html成品网页模板下载
  • 建设网站第一步产品设计培训机构排名
  • php网站有点小榄公司网站建设
  • app 网站开发公司电话广州网站建设哪家便宜
  • 企业网站经典案例南宁网站建设
  • 网站建设案例的公司一级A视网站 一级做爰片
  • 网站后台传图片网站建设的培训的感受
  • 丰台网站建设多少钱西安做网站的公司有
  • 固始县住房和城乡规划建设局网站做网站的企业有哪些
  • 游网站建设方案内容做模块高考题的网站