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

哪家网站做公司最好陕西省建设厅管理中心网站

哪家网站做公司最好,陕西省建设厅管理中心网站,qq群排名优化软件官网,微信做单网站有哪些以前也简单用过JNI#xff0c;但是只是简单用一下#xff0c;好多都不明白。最近在看源码部分#xff0c;有涉及到JNI调用的#xff0c;所以这次打算彻底把它搞定。 先普及一下JNI的调用关系#xff1a;JAVA------------------------JNI----------------------------…以前也简单用过JNI但是只是简单用一下好多都不明白。最近在看源码部分有涉及到JNI调用的所以这次打算彻底把它搞定。 先普及一下JNI的调用关系JAVA------------------------JNI-------------------------------Native. 我们需要从我们的入口代码写起我们先来一段含有native函数的简单类 package com.sahadev.regix; public class Hello {public static String getStringFromNative() {Bean createBean createBean();System.out.println(createBean.tag);return createBean.tag;}public static native Bean createBean(); }这段代码就是说从Native中生成了一个Bean对象然后将这个对象的tag属性返回给调用者。 所以这里有两个知识点可以学到 1.如果生成一个自定义对象 2.如何在native中生成String字符串对象 Ok既然Hello这个类有了createBean这个native方法则我们需要使用Jdk提供的javah命令来生成C/C所需要的头文件Javah命令的说明如下 用法:javah [options] classes 其中, [options] 包括:-o file 输出文件 (只能使用 -d 或 -o 之一)-d dir 输出目录-v -verbose 启用详细输出-h --help -? 输出此消息-version 输出版本信息-jni 生成 JNI 样式的标头文件 (默认值)-force 始终写入输出文件-classpath path 从中加载类的路径-bootclasspath path 从中加载引导类的路径 classes 是使用其全限定名称指定的 (例如, java.lang.Object)。在我们正常使用的时候只需要简单的几个参数即可我们以Hello这个类来举例说明 javah -d E:\Kongfuzi\HelloJNI com.sahadev.regix.Hellojavah最基本的不需要多说。-d 前面的用法已经说明用于指定输出目录我这里的输入目录是E:\Kongfuzi\HelloJNI最后是我们要对那个类操作的全路径名称必须写全包名最后需要注意的一点是必须在com包名的上一级目录执行一般是src目录否则会出现如下错误 E:\Kongfuzi\HelloJNI\src\comjavah -d E:\Kongfuzi\HelloJNI com.sahadev.regix.Hello 错误: 找不到 com.sahadev.regix.Hello 的类文件。上面是个错误的例子我现在位于src的下级目录com注意不可以。 当这个命令执行完成之后会在我们指定的目录生成一个以.h结尾的头文件 打开它 /* DO NOT EDIT THIS FILE - it is machine generated */ #include jni.h /* Header for class com_sahadev_regix_Hello */#ifndef _Included_com_sahadev_regix_Hello #define _Included_com_sahadev_regix_Hello #ifdef __cplusplus extern C { #endif /** Class: com_sahadev_regix_Hello* Method: createBean* Signature: ()Lcom/sahadev/regix/Bean;*/ JNIEXPORT jobject JNICALL Java_com_sahadev_regix_Hello_createBean(JNIEnv *, jclass);#ifdef __cplusplus } #endif #endif这是一段C代码上面的注释说不要去编辑这个文件这是机器自动生成的。看看它为我们自动生成了什么 红色箭头指出的便是我们在Java文件中自己定义的。好接下来我们来实现它 我们在工程中添加名为jni的文件夹(如果安装了NDK支持的话可以一键自动生成相关文件这里就不多介绍了)。 然后在其中添加Android.mk、com_sahadev_regix_Hello.h再新建一个名叫JNI_C.cpp的文件 打开JNI_C.cpp: 写入如下代码 // // Name : JNI_C.cpp // Author : Sahadev // Version : // Copyright : Your copyright notice // Description : Hello World in C, Ansi-style // #include jni.h//引入必须的JNI支持文件 #include com_sahadev_regix_Main.h//引入头文件JNIEXPORT jobject JNICALL Java_com_sahadev_regix_Main_createBean(JNIEnv *env,jclass jc) {jclass jcl1 env-FindClass(com/sahadev/regix/Bean); //载入Bean类注意写全包名,jclass 即为JAVA中的Class代表类jmethodID cMethodID env-GetMethodID(jcl1, init,(Ljava/lang/String;)V);//获取构造方法的ID第一个参数是从哪个类获取第二个参数init代表这是构造方法第三个参数代表传入的参数是String返回值为Void这里的写法可以从JNI的文档中找到return env-NewObject(jcl1, cMethodID,env-NewStringUTF(Hello,JNI!This is sahadev!));//最后通过调用这个方法传入一个jString的字符串 }我们将头文件引入然后拷贝头文件中的native方法添加参数变量添加方法体。 上面的代码后面有一部分注释这里补充一下findClass和Java中的ClassLoader差不多jclass等于Java中的Class在这里调用方法的话需要先得到方法的ID就像第二行使用了GetMethodID来获取这三个参数分别代表获取哪个类的方法构造方法传init普通方法写方法名第三个参数则代表参数个数类型返回值最后通过NewStringUTF来生成jString注意在c直接写出的字符串它并不是Java中的字符串必须通过NewStringUTF方法来实现最后通过调用NewObject方法来调用Bean的构造方法并传入参数jString来生成一个Bean对象并返回给调用者。具体资料请参见JNI官方文档 好我们的C文件写好了接下来就需要对它进行编译了这里的编译工具不是什么GUN而是Android官方提供的NDK-BUILD工具如果是在Eclipse中集成了NDK环境可以使用clean功能直接对它进行编译我们这里只介绍手动编译 首先我们需要编辑Android.mk文件: LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE : JNI_C LOCAL_SRC_FILES : JNI_C.cpp include $(BUILD_SHARED_LIBRARY)LOCAL_PATH即为调用命令的所在目录你在哪个目录下使用cmd命令这里就会返回它的路径地址 LOCAL_MODULE你生成的文件名称是什么输出之后会自动在名称的前后加上lib和.so LOCAL_SRC_FILES要对哪个文件进行编译。 http://developer.android.com/intl/zh-cn/ndk/guides/android_mk.html官方文档对上面的命令做了详细解释。 接下来需要进入通过cmd命令进入工程所在的目录然后使用命令ndk-build编译即可如果ndk-build目录没有添加入本地变量则使用全路径访问这个命令。我当时不知道这个命令如何使用就进入了ndk-build所在的目录想看看它的帮助说明结果出现了这样的提示 E:\Android_Sdk\android-ndk-r10endk-build Android NDK: Could not find application project directory ! Android NDK: Please define the NDK_PROJECT_PATH variable to point to it. E:\Android_Sdk\android-ndk-r10e\build/core/build-local.mk:143: *** Android NDK: Aborting . Stop.说没有发现应用的工程目录于是我就去build/core/build-local.mk文件中的143行查看是什么原因 ifndef NDK_PROJECT_PATHNDK_PROJECT_PATH : $(call find-project-dir,.,jni/Android.mk) endif ifndef NDK_PROJECT_PATHNDK_PROJECT_PATH : $(call find-project-dir,.,AndroidManifest.xml) endif ifndef NDK_PROJECT_PATH$(call __ndk_info,Could not find application project directory !)$(call __ndk_info,Please define the NDK_PROJECT_PATH variable to point to it.)$(call __ndk_error,Aborting) endif根据上下文应该是没有找到jni/Android.mk或者AndroidManifest.xml之类的文件再根据上下文发现有这么一段说明 # # # If NDK_PROJECT_PATH is not defined, find the applications project # path by looking at the manifest file in the current directory or # any of its parents. If none is found, try again with jni/Android.mk # # Note that we first look at the current directory to avoid using # absolute NDK_PROJECT_PATH values. This reduces the length of all # source, object and binary paths that are passed to build commands. # # It turns out that some people use ndk-build to generate static # libraries without a full Android project tree. # # If NDK_PROJECT_PATHnull, ndk-build make no attempt to look for it, but does # need the following variables depending on NDK_PROJECT_PATH to be explicitly # specified (from the default, if any): # # NDK_OUT # NDK_LIBS_OUT # APP_BUILD_SCRIPT # NDK_DEBUG (optional, default to 0) # Other APP_* used to be in Application.mk # # This behavior may be useful in an integrated build system. # # 也就是说如果你没有定义NDK_PROJECT_PATH的话它就会根据manifest文件去寻找工程路径这里的NDK_PROJECT_PATH你可以在环境变量中指定 这样的话就可以在任何地方直接使用ndk-build命令对工程目录进行编译了设置完成之后请重启cmd 好编译完成之后我们就可以在我们工程目录的obj目录下发现编译好的.so等相关文件 注意我们在Android.mk文件中定义的LOCAL_MODULE是JNI_C而这里的输出文件会为它自动加上lib前缀与.so后缀。 如果集成了NDK环境在Clean的时候会自动进行编译 编译完成之后就需要看看如何使用它了。 在使用的Java文件Hello中添加如下静态代码块 static {System.loadLibrary(JNI_C);}在这里的JNI_C便是我们在.mk文件中定义好的在使用它的时候它会自动为我们加上lib前缀与.so后缀以便访问我们的.so文件注意千万别自己加lib*.so以下是Runtime.loadLibrary的方法说明 Given the name MyLibrary, that string will be passed to System.mapLibraryName. That means it would be a mistake for the caller to include the usual lib prefix and .so suffix. 好接下来看一下如何运行 在Activity中调用Hello这个类的getStringFromNative方法这个方法便可以将从native中生成的字符串对象、Bean对象返回。 效果 快试试遇到什么问题欢迎留言。
http://www.zqtcl.cn/news/843325/

相关文章:

  • 网站备案成功后wordpress文字加框
  • 中小企业怎么优化网站西安网站建设求职简历
  • 网站开发者模式怎么打开商城网站建设特点有哪些
  • 网站登录按纽是灰色的做网站的前途怎么样
  • 常州城乡建设局网站霸榜seo
  • 网站响应样式如何制作自己的公众号
  • 网站的友情连接怎么做免费收录链接网
  • 太原网站设计排名wordpress 设置语言
  • 南京模板建站定制网站网站单页面怎么做的
  • 宁夏住房建设厅网站石家庄最新今天消息
  • 写网站软件tomcat部署wordpress
  • 怎么做下载网站吗分析一个网站
  • 网站建设禁止谷歌收录的办法做挂网站
  • 佛山优化网站公司做购物网站需要多少钱
  • 山东网站建设维护营销型网站是什么样的
  • 长沙营销网站建设苏州风险区域最新
  • 个人网站百度推广收费wordpress发邮件慢
  • 三门峡网站设计wordpress 去掉功能
  • 网站小程序开发公司wordpress 用户授权
  • 做外贸的几个网站响应式网站wordpress摄影
  • 专业建设网站技术wordpress 虚拟资源
  • 广告网站设计哪家快网站建设外包包含内容
  • 网页游戏网站模板张家口住房和城乡建设部网站
  • 冀州建设局网站公司制作网站多少钱
  • 建设个招聘网站黄页88和58那个推广好
  • 如何设计一个漂亮的网站电商设计素材
  • 沈阳建设银行网站首页果冻影视传媒有限公司
  • 建设部网站有建筑施工分包网站规划设计方案
  • 网站wap怎么做郑州做网站华久科技
  • 哪里网站开发好姜堰网站定制