Android ndk开发swig编译jni接口

时间:2021-11-08 08:57:38

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

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

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

Android ndk开发swig编译jni接口

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

Android ndk开发swig编译jni接口

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

Android ndk开发swig编译jni接口

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

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

Android ndk开发swig编译jni接口

在上图中左侧新建,输入名称。然后是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>

八 此时目录如下图:

Android ndk开发swig编译jni接口

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

Android ndk开发swig编译jni接口

十、最后生成效果,以及目录找到那个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库,以及存放的路径

Android ndk开发swig编译jni接口

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

Android ndk开发swig编译jni接口

十三、测试代码

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();

@Override
protected 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