JNI 之c++/ c 代码自动生成JNI接口——swig+cmake

666 阅读1分钟

一.下载并解压

swig 下载地址:www.swig.org/download.ht…

注意windows平台下载zip

二.环境配置

将swig.exe所在目录 添加到环境变量Path中

终端执行:swig -version 如果有输出测配置成功

三、生成JNI

1.编写c++代码

example.h

/* File : example.h */
#include <time.h>
double My_variable = 3.0;
int fact(int n) { 
 if (n <= 1) return 1;  
 else return n * fact(n - 1);
}
int my_mod(int x, int y) {   return (x % y);}

 example.cpp

/* File : example.cpp */
#include "example.h"

example.i

/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
%}
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);

example.i 中 extern 后为需要生成的JNI接口:方法或者属性

在src/main/cpp 目录下执行命令:

生成c++文件

 swig.exe -c++ -java -package com.apress.swig -outdir ../java/com/apress/swig example.i

生成c文件

swig -java -package com.apress.swig -outdir ../java/com/apress/swig example.i

-package后是输出java文件的包名

-outdir 后 是输出java文件的目录 

执行后会在-outdir中生成java接口,可以直接调用 如图

四、编译apk

CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)
add_library(example SHARED example.cpp example_wrap.cxx)
find_library(log-lib log)
target_link_libraries(example ${log-lib})

app/build.gradle

 android { 

         defaultConfig {

               externalNativeBuild { 

                    cmake { cppFlags "-std=c++11" abiFilters "armeabi-v7a"}               

               } 

        }  

        externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" } }

cmake配置好后make project 就可以生成包含 example.so文件的apk了

五、测试JNI

fun test() {    
   System.loadLibrary("example")    
   Log.d(TAG, "fengjing:" + example.getMy_variable())    
   Log.d(TAG, "fengjing:" + example.fact(5))
}