用djinni自动生成JNI相关文件
一、djinni是什么
djinni是个工具,用来生成JNI相关接口。现在很多人都是只懂java,或者只懂C++,很少有人两头都精通;即使两头都精通,自己写JNI接口也很复杂。这时候djinni就能很好的解决这些问题,我们只要按要求配置JNI接口的对象,就能生成两边的接口。除了java与C++,还能生成ObjC与C++等接口。
二、环境
java 1.8.0_101
djinni GitHub地址
msys2下载地址
因为djinni中的一些命令是linux中的命令方式,所以要下载个msys2,在msys2中运行
下载好后打开msys2,cd到djinni根目录下,输入以下命令来拉取库(整个过程时间很长)
src/run --help
三、编写djinni配置文件
配置文件中可以配置如下的接口,在C++中具体实现,然后被java或ObjC或其他语言调用
# This interface will be implemented in C++ and can be called from any language.my_cpp_interface = interface +c { method_returning_nothing(value: i32); method_returning_some_type(key: string): another_record; static get_version(): i32; # Interfaces can also have constants const version: i32 = 1;}
如果是C++调用其他语言的接口(+j指java,+o指ObjC),作如下定义
# This interface will be implemented in Java and ObjC and can be called from C++.my_client_interface = interface +j +o { log_string(str: string): bool;}
也可以定义其中需要一些实体类
my_enum = enum { option1; option2; option3;}my_flags = flags { flag1; flag2; flag3; no_flags = none; all_flags = all;}my_record = record { id: i32; info: string; store: set<string>; hash: map<string, i32>; values: list<another_record>; # Comments can also be put here # Constants can be included const string_const: string = "Constants can be put here"; const min_value: another_record = { key1 = 0, key2 = "" };}another_record = record { key1: i32; key2: string;} deriving (eq, ord)
配置好以后调用命令生成
src/run \ --java-out JAVA_OUTPUT_FOLDER \ --java-package com.example.jnigenpackage \ --java-cpp-exception DbxException \ # Choose between a customized C++ exception in Java and java.lang.RuntimeException (the default). --ident-java-field mFooBar \ # Optional, this adds an "m" in front of Java field names \ --cpp-out CPP_OUTPUT_FOLDER \ \ --jni-out JNI_OUTPUT_FOLDER \ --ident-jni-class NativeFooBar \ # This adds a "Native" prefix to JNI class --ident-jni-file NativeFooBar \ # This adds a prefix to the JNI filenames otherwise the cpp and jni filenames are the same. \ --objc-out OBJC_OUTPUT_FOLDER \ --objc-type-prefix DB \ # Apple suggests Objective-C classes have a prefix for each defined type. \ --objcpp-out OBJC_OUTPUT_FOLDER \ \ --idl MY_PROJECT.djinni
其中有几个重要的路径:
JAVA_OUTPUT_FOLDER java文件生成路径
CPP_OUTPUT_FOLDER cpp文件生成路径
JNI_OUTPUT_FOLDER jni文件生成路径
OBJC_OUTPUT_FOLDER objc文件生成路径(如果需要objc调用的话)
命令执行完成后去这几个路径把下面的文件拷贝到项目中使用即可。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。