相信越来越多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();
@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