您的位置:首页 > 编程语言

使用Swig自动生成JNI代码

2015-03-29 10:50 197 查看
此记录适用于AndroidStudio,Eclipse下适当修改亦可,但是一般Eclipse有UI下的操作方式。

Swig生成一个JNI代理类需要一个.i类的文件作为接口描述:

示例:

%module Unix
%{
#include<unistd.h>
%}

typedef unsigned int uid_t;

extern uid_t getuid(void);


这个描述文件定义了

1.这个模块的名称Unix,

2.插入的预处理指令#include<unistd.h>,

3.为了防止swig把uid_t看成对象的类型声明

4.函数原型

为了能够在ndk-build的时候将使用swig生成的代理和包装JNI/Java代码连接到库中,自定义一个Makefile文件如下(放到jni目录下):

ifndef SWIG_PACKAGE
$(error SWIG_PACKAGE is not define.)
endif

SWIG_OUTDIR := $(NDK_PROJECT_PATH)/java/$(subst .,/,$(SWIG_PACKAGE))
ifndef SWIG_TYPE
SWIG_TYPE := c
endif

ifeq ($(SWIG_TYPE),cxx)
SWIG_MODE := - c++
else
SWIG_MODE :=
endif

LOCAL_SRC_FILES += $(foreach SWIG_INTERFACE,$(SWIG_INTERFACES),$(basename $(SWIG_INTERFACE))_wrap.$(SWIG_TYPE))

LOCAL_CPP_EXTENSION += .cxx

%_wrap.$(SWIG_TYPE) : %.i
$(call host-mkdir,$(SWIG_OUTDIR))
swig -java $(SWIG_MODE) -package $(SWIG_PACKAGE) -outdir $(SWIG_OUTDIR) $<


实际上这个mk是通过编译过程中的定义来实现这个命令:

swig -java -package com.examples.swig -outdir src/com/examples/swig jni/Unix.i

为了能够实现在编译中确定这些参数的值,需要在Android.mk中定义他们并且在编译成共享库/其他库之前调用上述mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := com_examples_jnidemo_MainActivity
LOCAL_SRC_FILES := com_examples_jnidemo_MainActivity.c
LOCAL_LDLIBS := -llog

SWIG_PACKAGE := com.examples.swig
SWIG_INTERFACES := Unix.i
SWIG_TYPE := c

include $(LOCAL_PATH)/swig_generate.mk

include $(BUILD_SHARED_LIBRARY)


这样,执行构建编译的结果是:



这样只需要把libs中的文件转移到jniLibs中,然后把java合并到项目的和jniLibs同级的java目录即可:

此时我们只需要调用就好了:



运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: