参考:http://www.cnblogs.com/anyanran/archive/2010/11/22/ndk1.html
http://www.cnblogs.com/sevenyuan/p/4202759.html
感谢前辈做了这么详细的记录。
下面是自己根据前辈的记录实现的。
1.创建AndroidSoTest安卓项目,包名:package com.ybs.androidsotest

2.创建类java类,JNITest 这个类是native方法,目的是为了调用c中的方法,当然c库通过ndk工具命令最后生成了.so文件。一句话简单总结native方法就是java调用非java代码的接口。

package com.ybs.androidsotest;public class JNITest {// Native Method就是一个java调用非java代码的接口//这里执行了一个加法运算public native int add(int x, int y);
}

3.AndroidSoTest项目根目录创建jni文件夹,把c库中的代码放入。创建名称为mylib.c的文件。
这里c转成了jni中的语法,关于c中类型与jni中类型的对应关系,可以参见jni的相关文档。
这里注意了:这个add方法这里有个坑,
Java_项目包名(包名各级之间都是用下划线隔开的)_方法名

#include <string.h>
#include <jni.h>JNIEXPORT jint JNICALL
Java_com_ybs_androidsotest_JNITest_add( JNIEnv* env,jobject thiz,jint x,jint y )
{return x + y;
}

4.AndroidSoTest项目根目录jni文件夹中,把放入的.c文件生成.h头文件,执行命令:
下面命令意思是把JNITest.java生成JNITest.h ,
把生成的JNITest.h放入jni文件夹中

//这个命令是在linux上用的(建议用此命令,在执行此命令之前,去掉此JNITest.java 类中的包名生成.h文件)
javac JNITest.java && javah JNITest
//在cmd工具,命令:
javah -jni -classpath D:\android_workspace\AndroidSoTest\src -d D:\-jni com.ybs.androidsotest.JNITest

5.这里是生成的JNITest.h文件(这里这个文件是命令生成的,非手写)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNITest */#ifndef _Included_JNITest
#define _Included_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     JNITest* Method:    add* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_JNITest_add(JNIEnv *, jobject, jint, jint);#ifdef __cplusplus
}
#endif
#endif

6.AndroidSoTest项目根目录jni文件夹中,创建Android.mk文件。Android.mk是一个makefile,用来告诉NDK需要编译哪些文件,生成哪些模块。LOCAL_PATH表示c源代码文件的位置;LOCAL_MODULE表示生成的共享库的名称;LOCAL_SRC_FILES代表c代码的文件。不需要把头文件列在里面;头文件的依赖关系是ndk自动计算的。

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := mylib
LOCAL_SRC_FILES := mylib.cinclude $(BUILD_SHARED_LIBRARY)

7.AndroidSoTest项目根目录下创建Application.mk文件,Application.mk的作用是告诉Android SDK需要哪些库文件。有了它,NDK就可以把库放在正确的位置。APP_PROJECT_PATH代表android工程所在目录,在本例中它被放在中; APP_MODULES表示工程需要的库,如果有多个以空格分开。

APP_PROJECT_PATH := $(call my-dir)
APP_MODULES      := mylib

8.这里要生成.so文件了,进入到项目AndroidSoTest根目录下,执行ndk-build即可。
(要windows环境上装了ndk,并且配置了环境变量。ndk下载址:https://developer.android.google.cn/ndk/downloads/index.html ,下载后解压,在系统环境变量PATH中配置环境变量,以及ndk解压后放置的目录即可。放置路径可参考: D:\androids\android-ndk-r14b-windows-x86_64\android-ndk-r14b )
命令如下:

cd AndroidSoTest
ndk-build

这时候执行完命令项目的libs文件夹中会生成armeabi文件夹,这个armeabi文件夹中会生成mylib.so文件。项目根目录下还会生成obj文件夹及相关内容。

9.这里就可以在MainActivity中调用JNITest中的方法了。代码如下:

package com.ybs.androidsotest;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;public class MainActivity extends Activity {private TextView textView;//这里是静态加载,在生成so文件时,系统添加了lib前缀和.so后缀,这里参数就没有前缀和后缀static{System.loadLibrary("mylib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.textView);//这里要创建JNITest类的实例,再调用方法。JNITest test=new JNITest();int x = test.add(3, 5);//显示在textView上。textView.setText("test.add(3, 5)=="+x+"");}}

Android中调用.so库操作步骤相关推荐

  1. 在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决

    在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决 参考文章: (1)在Android中调用KSOAP2库访问webservice服务出现的服务端 ...

  2. 使用network管理DD恢复全库操作步骤

    使用network管理DD恢复全库操作步骤 基本信息: 系统平台:RHEL 5.4_86_64 database版本:11.2.0.2.0-64bit 1.检查目标主机是否安装networker客户端 ...

  3. Android中集成第三方库的方法和问题

    Android中集成第三方库的方法和问题 声明: 1. 本文參考了网上同学们的现有成果,在此表示感谢,參考资料在文后有链接. 2. 本文的重点在第三部分,是在开发中遇到的问题及解决的方法.第一,第二部 ...

  4. 如何在Android中使用emojicon库集成表情符号, 妈妈在也不用担心我的表情了~~~

    如何在Android中使用emojicon库集成表情符号 最全最专业的emojicon库教程. 在本教程中,我们将学习如何通过一个简单的示例在Android应用程序中使用emojicon库集成  表情 ...

  5. android wsdl封装,在Android中调用C#写的WebService(附源代码)

    由于项目中要使用Android调用C#写的WebService,于是便有了这篇文章.在学习的过程中,发现在C#中直接调用WebService方便得多,直接添加一个引用,便可以直接使用将WebServi ...

  6. android jni调用so库

    今天,讲讲android studio 使用jni调用其他so库的使用. 首先说一下在网上查找资料时,对于调用第三方so库,有人说有两种方法: 1.    对于so库的API符合JNI格式(即使用ja ...

  7. 『飞秋』在.NET 4中调用GDAL库时遇到的问题及解决方法

    『飞秋』在.NET 4中调用GDAL库时遇到的问题及解决方法 最近需要在.NET 4的环境中调用GDAL库.GDAL本身是一套非托管类库,不过还好提供了用SWIG做的托管的Wrapper. 可以在FW ...

  8. python中调用c库

    python中调用c库 2013-04-23 15:34:52|  分类: python核心编程 |  标签:python  makefile   |举报 |字号 订阅 参考地址:http://my. ...

  9. android demo 调用,Android中调用C++函数的一个简单Demo

    这里我不想多解释什么,对于什么JNI和NDK的相关内容大家自己去百度或谷歌.我对Android的学习也只是个新手 .废话少说直接进入正题. 一.在Eclipse中创建一个Android Applica ...

最新文章

  1. python打开中文文件名_[请教]python的中文文件名处理
  2. 字体设计师必备灵感来源
  3. VS 2005 2008 项目模板丢失问题
  4. C#数据库事务机制及实践(下)
  5. PAT (Basic Level) Practice1007 素数对猜想
  6. 每日算法系列【LeetCode 424】替换后的最长重复字符
  7. Spring源码解读(1)-IOC容器BeanDefinition的加载
  8. 单片机C语言的编译模式,手把手教你学单片机的C语言程序设计六编译预处理.pdf...
  9. Mac OS使用技巧之四:修改打开不同格式视频的默认播放器
  10. 在Ubuntu中安装LiteIDE
  11. 儿童python编程教程-一款儿童编程入门的理想工具——PythonTurtle
  12. Vue.js开发基础 05
  13. 命名实体识别主要方法
  14. 中学-综合素质【2】
  15. 聊一聊DDR3中的ODT(On-die termination)
  16. Android增强现实(三)-3D模型展示器
  17. ReID中PCB模型输出维度_搞定PCB信号完整性,只需9步!都可以学会
  18. 最新30个漂亮的个人作品集网页设计案例
  19. 小米手机android目录在哪里设置字体,在哪里修改小米手机的字体大小
  20. 推荐算法架构2:粗排

热门文章

  1. springboot实验课程辅助管理系统 毕业设计-附源码191113
  2. vsftpd服务----配置
  3. 【DNA计算】DNA编码----笔记1
  4. 数据挖掘期末-图注意力模型
  5. 《RefineMask:Towards High-Quality Instance Segmentation with Fine-Grained Features》论文笔记
  6. Python|利用tkinter制作桌面翻译工具,结构不是很复杂不过有点糙
  7. 一个人靠不靠谱,就看这三件小事
  8. 【花雕动手做】有趣好玩的音乐可视化系列小项目(14)---水杯水瓶灯
  9. mansory使用与UIScrollView
  10. 入耳式蓝牙耳机哪个牌子好用?四款高品质音乐游戏耳机