JNative学习
- 格式:docx
- 大小:16.06 KB
- 文档页数:2
从零开始学习ReactNative的开发React Native是一个目前非常流行的移动端开发框架,它可以帮助开发者快速构建跨平台的原生应用程序。
相比于传统的移动端开发方式,采用React Native可以大大提高开发效率,减少代码量,同时能够让开发者更加专注于业务逻辑层面的开发。
而本篇文章将介绍如何从零开始学习React Native的开发,以及学习过程中需要注意的一些事项。
一、React Native的基本概念在开始学习React Native之前,首先需要了解React Native的基本概念。
React Native是基于Facebook的React框架而开发出来的一种跨平台移动应用程序开发框架,支持使用JavaScript语言进行开发。
React Native的核心思想在于“一次编写,多处运行”,可以在不同平台上实现本地应用的构建工作。
React Native与React的主要区别在于它不使用DOM,而是使用类似于WebGL的技术,通过JavaScript进行渲染,从而保证了React Native的高效性。
此外,React Native还具有良好的组件化和状态管理,这使得开发者可以更加轻松地构建复杂的应用程序。
二、学习React Native的前置技能在学习React Native之前,需要具备一定的JavaScript基础和React框架的知识。
JavaScript是React Native的主要编程语言,因此需要熟悉JavaScript的语法规范和基本数据结构。
同时,React 是React Native的前置技能之一,需要了解React的基本概念和使用方式,包括组件、状态、事件等内容。
此外,了解一些基本的CSS样式知识也是有必要的。
React Native的组件和样式使用方式与Web开发的模式相同,可以使用类似于CSS的方式定义组件样式。
三、学习React Native的步骤1.环境搭建在学习React Native之前,需要搭建开发环境。
JAVA调用SDK动态链接库一、案例简述JA V A作为跨平台语言,开发中难免遇到跨平台调用接口方法,近期在项目定制开发过程中,现场需要JA V A平台通过DLL动态链接库设置DVR设备功能,如设置获取DVR设备白名单功能、开启关闭白名单功能、获取设置DVR设备码流是否加密、设置获取DVR设备的AES码流加密信息(包括加密密码、加密方式、加密瞬间等信息)等功能。
二、案例分析和解决过程初始化DLL动态库需要通过接口实体初始化DLL动态库,详细定义格式如下:public interface HCNetSDK extends StdCallLibrary {public static final String path ="C:\\Tools\\HCNetSDK_v4.1.5.61_20151015_WIN64\\lib\\HCNetSDK";HCNetSDK INSTANCE = (HCNetSDK)Native.loadLibrary(path, HCNetSDK.class);}其中:path为DLL动态库的路径,定义DLL动态库方法中的对象INSTANCE为DLL 动态库初始化的实例动态库方法的对象定义需要实现Structure,并重写Structure中的getFieldOrder方法,详细声明如下:public static class LPNET_DVR_DEVICEINFO_V40 extends Structure {public NET_DVR_DEVICEINFO_V30 struDeviceV30;public byte bySupportLock;public byte byRetryLoginTime;public byte byPasswordLevel;public byte byRes1;public int dwSurplusLockTime;public byte[] byRes2 = new byte[256];@Overrideprotected List getFieldOrder() {return Arrays.asList(new String[] {"struDeviceV30", "bySupportLock","byRetryLoginTime", "byPasswordLevel","byRes1", "dwSurplusLockTime", "byRes2"});}}其中:变量属性中byte[]对字节长度有严格要求,必须长度一致,否则调用时会出现JDK源代码错误。
native方法●Sun公司提供的JNI是Java平台的一个功能强大的接口。
这个JNI接口提供了Java与操作系统本地代码互相调用的功能。
●Native方法是用户在Java中可以使用,但不能编写的方法。
●JNI(Java Native Interface Java本地接口),它允许Java虚拟机(JVM)内部运行的Java代码能够与用其它编程语言(如C、C++、汇编语言)编写的应用程序和库进行互操作。
●JNI最大的好处是它没有对底层Java虚拟机的实现施加任何限制,因此,Java虚拟机厂商可以在不影响虚拟机其它部分的情况下添加对JNI的支持。
程序员只需编写一种版本的本地(Native)应用程序和库,就能够与所有支持JNI 的Java虚拟机协同工作。
●JNI可以理解为Java和本地应用程序之间的中介。
那么我们什么时候使用JNI呢?如果我们想要访问操作系统的特有功能,想要同特殊的硬件设备沟通,我们可以使用JNI技术,利用其它语言去实现、去调用、去访问操作系统的特有功能。
如果我们想重复使用过去编写的非java语言编写的代码,我们也可以使用JNI 技术。
如果我们想实现实时性很强的代码,可以采用其它语言去实现,如C和汇编语言,然后用JNI技术在Java中调用这种实现。
用本地方法编写一个Java程序(以HelloW orld.java为例):一、写Java代码:class HelloWorld {public native void displayHelloWorld();static {System.loadLibrary("hello");}public static void main(S tring[] args) {new HelloWorld().displayHelloWorld();}}二、编译Java代码:javac HelloWorld.java三、创建. h 的文件javah -jni HelloWorld产生的HelloWorld.h文件如下:/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/** Class: HelloWorld* Method: displayHelloWorld* Signature: ()V*/JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif四、写一个本地方法的实现新建HelloWorldImp.c#include <jni.h>#include "HelloWorld.h"#include <stdio.h>JNIEXPORT void JNICALLJava_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)//HelloWorld.h中声明的函数原型{printf("Hello world!\n");return;}第五步:创建一个共享的库cl -I C:\Java\j2sdk1.5.0\include-I C:\Java\j2sdk1.5.0\include\win32 -LD HelloWorldImp.c -Fehello.dll这里的cl是安装了Visual C++而提供的编译工具。
Java中的Native⽅法⽬录1.Native⽅法在Java中如何⼯作?2.Java中Native⽅法的⽰例3.总结以下是java中如何使⽤native⽅法的基本语法:[ public / protected / private] native [return-type] methodName ();上⾯的语法显⽰了如何在java中声明本机⽅法。
与普通⽅法⼀样,它需要定义⼀个访问修饰符,后跟⼀个native关键字,后跟⽅法的返回类型,最后是⽅法名称,如果需要,还需要指定输⼊参数。
1.Native⽅法在Java中如何⼯作?它可以定义为那些⽤java以外的语⾔(如C/C++)实现的⽅法。
使⽤这些⽅法背后的总体思路可能是利⽤C/C++中提供的⾼性能或内存管理。
为了⽀持⽤其他语⾔编写的⽅法,Java提供了⼀个称为Java Native Interface的接⼝,它充当Java和其他语⾔之间的中介。
使⽤JNI的动机来⾃这样⼀个事实:它可以提供代码重⽤性和⾼性能。
需要注意的是,⽤C/C++等其他语⾔编写的代码是不可移植的。
以下是Java本机native接⼝的主要组件:javah:这是java开发⼯具包中提供的⼀个⼯具,它从包含native⽅法的现有java⽂件java类中创建与C兼容的头⽂件。
h:这是Java开发⼯具包中提供的基于C/C++的头⽂件,其功能是提供Java数据类型和native数据类型之间的映射。
上⾯描述的Javah⽂件⾃动⽣成这个⽂件。
2.Java中Native⽅法的⽰例现在我们将看到⼀个⽰例,它将清楚地了解native⽅法在java中的⼯作⽅式。
以下是使⽤native⽅法所涉及的步骤:1. 编程java代码。
2. 编译java代码。
3. 创建⼀个C头⽂件。
4. 在C/C++中实现native⽅法逻辑。
5. 创建⼀个共享库。
6. 运⾏并测试java应⽤程序。
下⾯的⽰例将分为两部分:具有java代码和具有native代码。
学习JNA,Jnative个人总结首先说下JAVA调用DLL,Java调用DLL的常用方法大致为几种,JNI,JNA,Jnative等,但实现与易用性差距还是很大,1.JNI用的人比较多,但相对来说比较麻烦要熟悉c并且要使用javac 及javah 命令,步骤繁琐2.JNA,Jnative相对简单只需要用实现接口,使用相对简单,但无论使用什么调用dll 文件,比较令人头疼的都是JAVA与C之间类型对应与值对应。
下面我将项目中对着JNA及jnative 的使用总结下。
1.JNA样码步骤如下:a,下载JNAjar文件,拷贝至系统根目录或者系统system32下b,代码很easyJava代码package .app;import com.sun.jna.Library;import com.sun.jna.Native;public class DLLTEST {// 1.实现PegRoute.dll 文件接口public interface PegRoute extends Library {// 2.PegRoute.dll 中 HCTInitEx方法public int HCTInitEx(int Version, String pStrCurrentDirectory);}public static void main(String[] args) {//3.加载DLL文件,执行dll方法PegRoute epen = (PegRoute) Native.loadLibrary("PegRoute",PegRoute.class);if (epen != null) {System.out.println("DLL加载成功!");int success = epen.HCTInitEx(0,"");System.out.println("1.设备初始化信息!" + success);}}}2.Jnative样码1.下载jnative。
Java学习路线先学习j2se要学习j2ee就要先学习j2se,刚开始学习j2se先建议不要使用IDE,然后渐渐的过渡到使用IDE开发,毕竟用它方便嘛。
学习j2se推荐两本书,《java2核心技术一二卷》,《java编程思想》,《java模式》。
其中《java编程思想》要研读,精读。
这一段时间是基本功学习,时间会很长,也可能很短,这要看学习者自身水平而定。
不要被IDE纠缠在学习java和j2ee过程中,你会遇到五花八门的IDE,不要被他们迷惑,学JA V A的时候,要学语言本身的东西,不要太在意IDE的附加功能,JA V A编程在不同IDE之间的转换是很容易的,过于的在意IDE的功能反而容易耽误对语言本身的理解。
目前流行的IDE有jbuilder,eclipse和eclipse的加强版WSAD。
用好其中一个就可以了,推荐从eclipse入手j2ee。
因为Jbuilder更适合于写j2se程序。
选择和学习服务器使用配置当你有了j2se和IDE的经验时,可以开始j2ee的学习了,web服务器:tomcat,勿庸置疑,tomcat为学习web服务首选。
而应用服务器目前主要有三个:jboss、weblogic、websphere。
有很多项目开始采用jboss,并且有大量的公司开始做websphere或weblogic向jboss应用服务器的移植(节省成本),这里要说的是,学习tomcat和jboss我认为是首选,也是最容易上手的。
学习服务器使用配置最好去询问有经验的人(有条件的话),因为他们或许一句话就能解决问题,你自己上网摸索可能要一两天(我就干过这种傻事),我们应该把主要时间放在学习原理和理论上,一项特定技术的使用永远代替不了一个人的知识和学问。
学习web知识如果你是在做电子商务网站等时,你可能要充当几个角色,这是你还要学习:.'l:8SxT?L html,可能要用到dreamwave等IDE。
聊聊Java中的Native修饰符⽬录Native修饰符的使⽤native主要⽤于⽅法上说明举例Native修饰的⽅法到底有什么⽤处什么是NativeMethod为什么要使⽤NativeMethodJVM怎样使NativeMethod跑起来Native修饰符的使⽤native主要⽤于⽅法上1、⼀个native⽅法就是⼀个Java调⽤⾮Java代码的接⼝。
⼀个native⽅法是指该⽅法的实现由⾮Java语⾔实现,⽐如⽤C或C++实现。
2、在定义⼀个native⽅法时,并不提供实现体(⽐较像定义⼀个Java Interface),因为其实现体是由⾮Java语⾔在外⾯实现的。
说明Java语⾔本⾝不能对操作系统底层进⾏访问和操作,但是可以通过JNI接⼝调⽤其他语⾔来实现对底层的访问。
JNI是Java本机接⼝(Java Native Interface),是⼀个本机编程接⼝,它是Java软件开发⼯具箱(Java Software Development Kit,SDK)的⼀部分。
JNI允许Java代码使⽤以其他语⾔编写的代码和代码库。
Invocation API(JNI的⼀部分)可以⽤来将Java虚拟机(JVM)嵌⼊到本机应⽤程序中,从⽽允许程序员从本机代码内部调⽤Java代码。
举例在JDK源码中,以system.class为例,由于调⽤操作系统的相关⽅法,⽽操作的实现并不是⽤Java,所以就会有很多native修饰的⽅法Native修饰的⽅法到底有什么⽤处今天偶然看代码,发现别⼈有这样写的⽅法,并且jar⾥⾯有⼏个dll⽂件,⽐较奇怪,于是把代码打开,发现如下写法。
public native String GSMModemSMSReadAll(String s, int i);public native String GSMModemGetErrorMsg(String s);public native boolean GSMModemIsConn(String s);觉得挺有趣的,找了找⽹络上的资料,感觉不错。
Java完全自学手册(适合初学者的简易学习文档)近年来java初学者越来越多,但是相应的没有一个可供java初学的朋友一个免费的资料下载平台,华清远见对于这个问题,专门在华清远见的官网为大家设立了专门技术文章交流的平台供大家参考,我们也会随时分享含金量多的技术文章,先为大家分享一个java自学手册看看,更多资料可以访问华清远见官网。
1.1、【Java基础知识复习(面向对象)】1.1.1、【Java面向对象四个基本特点】抽象、继承、多态、封装1.1.1.1【抽象的概念】抽象是忽略一个主题中与当前目标无关的方面,把现实世界中的概念转换为对象,可以是表示数据的VO对象或抽象类,也可以是表示一类行为的接口。
有利于使用继承来构造类的体系,实现多态,使用模板和工厂模式方法来实现对业务过程的抽象。
抽象是概念建模和业务流程建模很重要的工具,是面向对象体系的基石,而不是一堆杂乱、混乱、重复、散沙般的、关系错综复杂的类。
1.1.1.1.1【抽象的使用】1.抽象在java中用关键字abstract表示2.抽象abstract可定义在类class的前面、如果定义类为抽象、则表示此类为一个抽象类、被抽象类所修饰的类类中的方法都是抽象方法3.通常抽象类中的方法没有具体的实现1.1.1.2【继承的概念】是一种连结类的层次模型,并且允许和鼓励类的重用,提供了一种明确表示共性的方法。
继承意味着能声明一个类型,而且能继承父类中的所有操作和数据,同事还有机会声明自己的新方法以改进、具体化、代替或者扩展父类中的方法使用父类为应用领域建立层次模型,提供代码重用并允许定制1.1.1.2.1【继承的使用】1.继承在java中用关键字extends表示2. Java中不支持多继承只支持单继承多实现3. extends写在类名后面4.一个类如果要防止继承请使用关键字final。
1.1.1.3【多态的概念】一种事物具有多种表现形态称为多态,一个对象变量可以指向多种实际类型的现象。
在Java程序中使用JNative调用dll文件因为项目需求,需要在java中调用dll文件。
测试过几种方法,发现还是JNative最为便利。
1.安装到下载最新的JNative二进制包,解压后得到3个文件:JNativeCpp.dll,libJNativeCpp.so,JNative.jar,其中:JNativeCpp.dll 放在windows/system32目录下libJNativeCpp.so linux下使用JNative.jar 导入工程中2.使用2.1.加载dll文件JNative可使用两种方式加载dll文件:使用System.loadLibrary加载使用此方法可加载系统目录中的dll文件。
可以先把dll文件复制到system32目录下,使用文件前缀名作为参数来加载dll文件。
使用System.load加载此方法参数为dll文件全路径名。
2.2.调用函数1、首先创建JNative对象:JNative jnative = new JNative(dll文件名, 函数名);2、设置返回值类型:jnative.setRetVal(Type.INT);3、设置参数jnative.setParameter(0, Type.STRING, …); //设置第一个参数为字符串jnative.setParameter(1, Type.INT, String.valueof(…));//设置第二个参数为整数4、执行n.invoke();5、获取返回值Integer.parseInt(jnative.getRetVal());2.3.一个实例来自国外网上的一个实例,用于摸索struct处理方法:import org.xvolks.jnative.JNative;import org.xvolks.jnative.exceptions.NativeException;import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;import org.xvolks.jnative.pointers.Pointer;import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;/*** SystemTime** typedef struct _SYSTEMTIME {* WORD wYear;* WORD wMonth;* WORD wDayOfWeek;* WORD wDay;* WORD wHour;* WORD wMinute;* WORD wSecond;* WORD wMilliseconds;* } SYSTEMTIME,*/public class SystemTime extends AbstractBasicData<SystemTime> {public short wYear;public short wMonth;public short wDayOfWeek;public short wDay;public short wHour;public short wMinute;public short wSecond;public short wMilliseconds;/*** 分配内存,并返回指针*/public Pointer createPointer() throws NativeException {pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));return pointer;}/*** 内存大小*/public int getSizeOf() {return 8 * 2;}/*** 获取通过内存指针解析出结果*/public SystemTime getValueFromPointer() throws NativeException {wYear = getNextShort();wMonth = getNextShort();wDayOfWeek = getNextShort();wDay = getNextShort();wHour = getNextShort();wMinute = getNextShort();wSecond = getNextShort();wMilliseconds = getNextShort();return this;}public SystemTime() throws NativeException {super(null);createPointer();}public String toString() {return wYear + "/" + wMonth + "/" + wDay + " at + " + wHour + ":" + wMinute + ":" + wSecond + ":" + wMilliseconds;}public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {// 创建对象JNative nGetSystemTime = new JNative("Kernel32.dll", "GetSystemTime");SystemTime systemTime = new SystemTime();// 设置参数nGetSystemTime.setParameter(0, systemTime.getPointer());nGetSystemTime.invoke();// 解析结构指针内容return systemTime.getValueFromPointer();}public static void main(String[] args) throws NativeException, IllegalAccessException {System.err.println(GetSystemTime());}}使用JNative,在Java中传递一个C/C++结构参数到动态库中用C++写的动态库的导出方法的代码如下:1.struct TestStruct {2.int a ;3.int b ;4.} ;5.6.extern"C"__declspec(dllexport) TestStruct* ShowStruct(TestStruct* testStruct)7.{8.9. cout<<"在动态库中打印:传入动态库中的结构成员a的值为:"<<testStruct->a<<endl;10.11.//改变传入结构成员a的值为10012. testStruct->a=100;13.return testStruct;14.}方法ShowStruct传入一个结构指针,并且反回一个结构指针,这里是同一个结构指针。
JNative学习
(2012-08-06 13:19:38)
转载▼
标签:
分类:JNative
杂谈
在学习JNative中,唯一觉得不足的是资料好少,基本上借鉴版本好少,相关的书籍更是寥寥无几。
在使用JNative有很多细节不是很懂,想具体的分析,资料又欠缺。
在网上查找的相关的知识如下:
1.下载相关的JNative包,找到如下文件,并放到相关的位置
JNativeCpp.dll 放在windows/system32目录下
libJNativeCpp.so linux下使用
JNative.jar 导入工程中
2.使用
2.1. 加载dll文件
JNative可使用两种方式加载dll文件:
(1)使用System.loadLibrary加载
使用此方法可加载系统目录中的dll文件。
可以先把dll文件复制到system32目录下,使用文件前缀名作为参数来加载dll文件。
(2)使用System.load加载
此方法参数为dll文件全路径名。
2.2. 调用函数
1、首先创建JNative对象:
JNative jnative = new JNative(dll文件名, 函数名);
2、设置返回值类型:
jnative.setRetVal(Type.INT);
3、设置参数
jnative.setParameter(0, Type.STRING, …); //设置第一个参数为字符串
jnative.setParameter(1, Type.INT, String.valueof(…)); //设置第二个参数为整数
4、执行
n.invoke();
5、获取返回值
Integer.parseInt(jnative.getRetVal());
目前总结至此,尚在学习期间。