# jnitool **Repository Path**: sweetdark/jnitool ## Basic Information - **Project Name**: jnitool - **Description**: 用python实现一个从java的class的文件转换成一个C++的结构体和一个JNI的转换类 - **Primary Language**: Python - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 2 - **Created**: 2014-11-30 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: utils **Tags**: None ## README @jnitool version 1.0 # 工具的需求 这是一个代码生成工具是为了方便,自定义的Java结构体转成C++结构体方便C++的调用,通过对JNI的封装了方便C++和Java结构体之间的交互. 对自定义java结构体访问的封装,避免到处调用jni去访问该结构体,集中式管理。 比如在修改java结构体的命名或字段名时,如果不修改所有C++对应的调用部分(如果这种调用到外都是),编译并不会出错,运行时会出现莫名其妙的错误。但如果改成访问相应的C++结构体,在修改java结构体时,使用工具更新一下C++的结构体就可以了(如果有非基本类型或数组要做一点相应的修改),在编译的时候其它地方就会因为访问错误的字段名而出错。 ## 工具的使用 运行需要安装jdk. 为了方便在命令行中使用 ,可以把工具所在的路配置到环境变量中。 ``` 用法 jnitool [选项] [包名]类名 此程序会调用javap命令,请确保在命令行中可以执行javap命令。此命令类似于javap命令 -classpath <目录> 指定类文件路径中间不能有空格,不指定则默认是当前目录 -out <目录> 指定输出路径中间不能有空格,不指定则默认是当前目录 -help 输出帮助提示 例子:jnitool -classpath e:\\my_project\\bin\\com\\cn -out e:\\my_project\\src Data jnitool -classpath e:\\my_project\\bin com.cn.Data jnitool -help ``` 输出的文件是以java的类名来命名的,如上面的则是Data.h和Data.cpp文件 * 源代码使用python 2.7的版本编写 * 如果下载源码可以使用[py2exe](http://sourceforge.net/projects/py2exe)打包,运行python setup.py py2exe ### 版本缺陷 * 对于非基本类型无法生成相应的JNI代码,需求修改一下生成。因为不能通过JNI直接把C++的对象,赋值给Java对象。这个可以参考JNI文档。比如java的String对象 * 只支持public类型的字段(是否要支持private字段有代考虑,因为有时private字段就是不希望被访问的,但java的建议所有字段都用private后用get和set方法,这与C++的结构的所有字段为public有点不同) ``` cpp jstr = (*env)->GetObjectField( obj, fid); str = (*env)->GetStringUTFChars(jstr, NULL); if (str == NULL) { return; /* out of memory */ } (*env)->ReleaseStringUTFChars(jstr, str); /* Create a new string and overwrite the instance field */ jstr = (*env)->NewStringUTF("123"); if (jstr == NULL) { return; /* out of memory */ } (*env)->SetObjectField(obj, fid, jstr); ``` ## 测试 在配置好环境变量之后 用命令行进入到example目录下(win7可以打开到example目录下后,按住shift+右键,在此处打开命令行窗口),运行jnitool com.Point就可以看到输出了point.h和point.cpp文件。 ## 未来考虑增加的功能 * **对基本类型的数组类型的支持** * 增加配置文件,命令空间namespace和输出的文件名可以通过配置来定义 ## 反馈方式 * 提issues http://git.oschina.net/sweetdark/jnitool/issues * Email: qiujunwei1@gmail.com