1 Star 0 Fork 2

豆米 / jnitool

forked from Mario_Q / jnitool 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 3.13 KB
一键复制 编辑 原始数据 按行查看 历史
Mario_Q 提交于 2014-12-12 10:28 . update readme and delete pyc files

@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打包,运行python setup.py py2exe

版本缺陷

  • 对于非基本类型无法生成相应的JNI代码,需求修改一下生成。因为不能通过JNI直接把C++的对象,赋值给Java对象。这个可以参考JNI文档。比如java的String对象
  • 只支持public类型的字段(是否要支持private字段有代考虑,因为有时private字段就是不希望被访问的,但java的建议所有字段都用private后用get和set方法,这与C++的结构的所有字段为public有点不同)
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和输出的文件名可以通过配置来定义

反馈方式

Python
1
https://gitee.com/domi7_admin/jnitool.git
git@gitee.com:domi7_admin/jnitool.git
domi7_admin
jnitool
jnitool
master

搜索帮助