此记录适用于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目录即可:
此时我们只需要调用就好了:
运行结果:
时间: 2024-11-08 23:00:42