码迷,mamicode.com
首页 > 其他好文 > 详细

使用Swig自动生成JNI代码

时间:2015-03-29 12:05:55      阅读:2880      评论:0      收藏:0      [点我收藏+]

标签:

此记录适用于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目录下):

 1 ifndef SWIG_PACKAGE
 2     $(error SWIG_PACKAGE is not define.)
 3 endif
 4 
 5 SWIG_OUTDIR := $(NDK_PROJECT_PATH)/java/$(subst .,/,$(SWIG_PACKAGE))
 6 ifndef SWIG_TYPE
 7     SWIG_TYPE := c
 8 endif
 9 
10 ifeq ($(SWIG_TYPE),cxx)
11     SWIG_MODE := - c++
12 else
13     SWIG_MODE :=
14 endif
15 
16 LOCAL_SRC_FILES += $(foreach SWIG_INTERFACE,$(SWIG_INTERFACES),$(basename $(SWIG_INTERFACE))_wrap.$(SWIG_TYPE))
17 
18 LOCAL_CPP_EXTENSION += .cxx
19 
20 %_wrap.$(SWIG_TYPE) : %.i
21     $(call host-mkdir,$(SWIG_OUTDIR))
22     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文件:

 1 LOCAL_PATH := $(call my-dir)
 2 
 3 include $(CLEAR_VARS)
 4 
 5 LOCAL_MODULE    := com_examples_jnidemo_MainActivity
 6 LOCAL_SRC_FILES := com_examples_jnidemo_MainActivity.c
 7 LOCAL_LDLIBS := -llog
 8 
 9 SWIG_PACKAGE := com.examples.swig
10 SWIG_INTERFACES := Unix.i
11 SWIG_TYPE := c
12 
13 include $(LOCAL_PATH)/swig_generate.mk
14 
15 
16 include $(BUILD_SHARED_LIBRARY)

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

技术分享

 

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

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

技术分享

运行结果:

技术分享

 

使用Swig自动生成JNI代码

标签:

原文地址:http://www.cnblogs.com/lhyz/p/4375369.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!