Android ndk开发swig编译jni接口

来源:互联网 发布:兴业证券 炒股软件 编辑:程序博客网 时间:2024/06/02 11:18

相信越来越多Android程序员需要用到Android ndk开发swig编译jni接口,因为这设计到底层编程,如果开发的项目是有硬件产品的话,那更要熟悉这方面的编程。我网上也看了很多关于这方面博客。总的来说,都有一定区别。那我介绍也是跟网上有一定的区别,首先说一下编译环境配置。Android开发编译环境就不用我多说了吧。我用ndk版本是这个android-ndk-r8d-windows,swig编译时这个swigwin-3.0.2。如果怕网上找不到这两个压缩包,就评论区留下邮箱吧。

1、加载ndk位置,首先说一下这个路径,一定不能有空格,或者中文。

window----preferences------Android------NDK 如下图:

二、项目右键找到Android tool------add native suppot 按下去,出现下图:确定

三、现在项目的目录结构是这样的。如下图所示:

四、配置swig路径。以及输出目录。

点击如下图上方箭头所示,出现external tool configurations,点击这个。如图

在上图中左侧新建,输入名称。然后是swig的路径,每个人按照自已去弄。

working directory :     这个是一样 ${project_loc}

arguments:

-c++ -java -package com.example.jnidmeo
-outdir src/com/example/jnidmeo jni/Unix.i   

这里意思是编译成java存放的目录,以及需要编译c++文件的位置,根据自已项目包名填写。

apply同意,如果你还没写好c++,就不要点击run。写好要编译c++,在点击run。

五、jni目录下application.mk配置如下,如果没有这个文件,自已新建一个,写下配置.

APP_ABI := armeabi

APP_STL := stlport_static

六 Android.mk配置

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := JniDmeoLib                 //这个是生成库的名字
LOCAL_SRC_FILES := Unix_wrap.cxx

include $(BUILD_SHARED_LIBRARY)

这上面意思自已去百度一下,篇幅过长,先不做解释

七  Unix.i文件配置如下:

%module JniDmeoLib

%include "std_string.i"

%{
#include <src\Ctest.cpp>
#include <src\CoutputChar.cpp>
%}
%include <src\Ctest.h>
%include <src\CoutputChar.h>

八 此时目录如下图:

九  现在就回到那个按键点击 Run 返回刚才你配置那里Run,出现下图,不报错就是那个样子:

十、最后生成效果,以及目录找到那个JniDmeoLibJNI.class 

打开,写上加载库 

static{
  System.loadLibrary("JniDmeoLib");
 }

如下代码:加粗的地方就是需要写的,双引号是你的库名字。

/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 3.0.2 * * Do not make changes to this file unless you know what you are doing--modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */package com.example.jnidmeo;public class JniDmeoLibJNI {<span style="color:#000000;"><strong>//下面static要自已写上去,加载生成JniDmeoLib库."JniDmeoLib"是库名字static{System.loadLibrary("JniDmeoLib");}</strong></span>  public final static native long new_CTest();  public final static native void delete_CTest(long jarg1);  public final static native double CTest_getTest(long jarg1, CTest jarg1_, double jarg2, double jarg3);  public final static native long new_CoutputChar();  public final static native void delete_CoutputChar(long jarg1);  public final static native String CoutputChar_getfileName(long jarg1, CoutputChar jarg1_);  public final static native void CoutputChar_setfileName(long jarg1, CoutputChar jarg1_, String jarg2);}


十一、选中你的项目,再点击project-----build project,出现图下:生成so库,以及存放的路径

十二、最后目录时这样的。

十三、测试代码

package com.example.jnidmeo;import android.os.Bundle;import android.app.Activity;import android.view.View;import android.widget.TextView;public class MainActivity extends Activity {//使用swig自动编译出来的jni接口调用c++里面方法实现的private CTest mCTest = new CTest();private CoutputChar mCoutputChar = new CoutputChar();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mCoutputChar.setfileName("strname");}//测试调用c++方法public void BtTest(View v) {TextView tvShow = (TextView) findViewById(R.id.tv_test);tvShow.setText("CoutputChar获取值:"+ String.valueOf(mCoutputChar.getfileName()) + ", CTest:计算值"+ String.valueOf(mCTest.getTest(1.99, 2.88)));}}

 

你可以设置为库,生成jar包,jar包和so文件拿到其它项目去用。
到这里就结束了,如有不清楚地方请留言。

项目源码:http://download.csdn.net/detail/qq_16064871/8533997

转载注明出处:http://blog.csdn.net/qq_16064871

 

 

 

 

 

 

 

 

1 0