转自:http://blog.csdn.net/jiuyueguang/article/details/9447245

版权声明:本文为博主原创文章,未经博主允许不得转载。

0:前言:

  1. 这两天一直在研究用android的jni调用第三方库,上网搜方法,但是都是泛泛而谈,没有demo,经过我几番折磨,写了n多的 helloword工程,总是不成功,工程名字也就由helloowrd转到shithelloword再转到fuckhelloword再转到 bitchhelloword再转到ganhelloword再转到helloword,在最后成功了!yeah,记录下来,为自己和他人方便
  2. 不 得不吐槽一下我的破电脑,ubuntu下eclipse打开后,cpu占用率直接飙到180%,然后ubuntu就把eclipse给kill掉了,然后 eclipse就退出了,后来总结原因是我的eclipse的工程中有android系统的整个文件系统的源码,然后把他close project后就好多了,不会被ubuntu给kill掉了
  3. 篇幅介绍:
    1. 第一篇:主要是介绍从头建立一个hello的工程,这里面创建库libhello.so然后在java程序中调用他,有一个相对来说一气呵成的步骤
    2. 第二篇:主要是介绍用android程序直接调用第三方库
    3. 第三篇:主要是介绍用android程序整合第三方库到自己的库中,
    4. 在这三篇中,避免枯燥,作者会设置一定的场景,
  4. 如果作者有说的不对的地方,请指出,因为作者也是刚弄“明白”

[第一篇:android调用第三方库——编写库libhello.so]

[第二篇:android调用第三方库——编写库android程序直接调用第三方库libhello.so]

[第三篇:android调用第三方库——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so]

[第四篇:android调用第三方库——调用多个第三方库的写法]

1:场景:甲方非软件公司要做一个android客户端,功能主要是“人脸识别”,然后找到乙方软件公司(该公司人脸识别比较牛逼,主要是用C++
代码实现人脸识别,但是这个公司没有做android程序的,长远考虑招一个会android的程序员,临时考虑的话,把android程序外包给丙方软
件公司)

2:分析:乙方C++公司现在的主要任务是做自己的业务逻辑库,然后把库交给丙方android公司来做android程序,然后交差拿钱。第一篇都是以乙方C++公司为主体来做程序,作者以hello模拟

3:前提:

  1. ubuntu64位系统
  2. android-ndk-r8e已经安装好,并且配置到eclipse里面
  3. android-sdk-linux已经安装好,并且配置到eclipse里面

4:搞起:

新建一个android项目(这里乙方C++公司新建的是android程序,后期会转化为C++程序),名称为hello;报名为com.hello.hello如图,图中的jni和libs和obj文件夹不要管他,他们是后来自动生成的。

项目hello右键-》Android Tools-》Add Native Support-》填写你需要生成的库名称,这里写hello就行,确定之后就自动生成了jni文件夹了,里面有hello.cpp和Android.mk

在HelloActivity.java中添加代码如上图

    package com.hello.hello;  

    import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle; public class HelloActivity extends Activity {
static
{
System.loadLibrary("hello");
}
public static native String sayHello(); // 本地库函数
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new AlertDialog.Builder( this ).setMessage( sayHello() ).show();
}
}

4.利用javah生成头文件,而且利用eclipse整合javah的方式,比较方便,万一我的java文件有修改的地方,利用这种方式显示出极大的方便性,请尊驾移布[ubuntu下整合eclipse和javah生成jni头文件开发android的native程序

5.编写jni文件夹下的hello.cpp文件

    #include <string.h>
#include <jni.h>
#include "com_hello_hello_HelloActivity.h" /*
* Class: com_hello_word_HellowordActivity
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_hello_hello_HelloActivity_sayHello(JNIEnv *env, jclass){
return env->NewStringUTF("hello");
}
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env = NULL;
jint result = -;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
return result;
}
return JNI_VERSION_1_4;
}

6.编写jni文件夹下的Android.mk文件。

    LOCAL_PATH := $(call my-dir)  

    include $(CLEAR_VARS)  

    LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.cpp include $(BUILD_SHARED_LIBRARY)

7.修改项目的编译选项:项目右键-》Properties-》C/C++ Build-》Build command中填写你的android-ndk的根目录;Behaviour选项卡中的Build为空,

8.编译项目,项目右键-》build project,会看到控制台输出,说明我们的是正确的,good!

    **** Build of configuration Default for project hello ****  

    /opt/EmbedSky/android-ndk-r8e/ndk-build
Compile++ thumb : hello <= hello.cpp
SharedLibrary : libhello.so
Install : libhello.so => libs/armeabi/libhello.so

9.运行android项目,会看到下图,说明是正确的,至此我们编写的库文件能够被正确的被自己的程序调用,

  1. 现在项目完成,把项目中用的头文件com_hello_hello_HelloActivity.h和生成的哭文件libhello.so(在libs/armeabi 文件夹下)和接口文档交给项目经理,然后项目经理再转交给丙方android公司
  2. 去看丙方android公司的笑话去吧-------》》》[第二篇:android利用jni调用第三方库——编写库android程序直接调用第三方库libhello.so]

5:demo的下载地址[猛戳这里下载demo

android调用第三方库——第一篇 (转载)的更多相关文章

  1. android调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so (转载)

    转自:http://blog.csdn.net/jiuyueguang/article/details/9449737 版权声明:本文为博主原创文章,未经博主允许不得转载. 0:前言 1:本文主要作为 ...

  2. [置顶] android调用第三方库——第四篇——调用多个第三方库

    0:前言: 在前面三篇中我们介绍了android调用第三方库的形式,在这一篇中我们介绍调用多个第三方库的Android.mk的写法,由于其他三篇介绍的很详细,这里只给出Android.mk的内容. [ ...

  3. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

  4. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  5. Android JNI如何调用第三方库

    http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的 ...

  6. [Android] Android 常见第三方库汇总地址

    Android 常见第三方库汇总地址 https://github.com/wasabeef/awesome-android-libraries List of Android Libraries T ...

  7. Android开源框架Afinal第一篇——揭开圣女的面纱

    Android开源框架Afinal第一篇——揭开圣女的面纱 分类: Android开源框架哪点事2013-09-02 14:25 260人阅读 评论(0) 收藏 举报 Afinal 这是Afinal在 ...

  8. 用NDK调用第三方库

    用NDK调用第三方库遇到不少坑,总结一下. 1.添加JNI目录 参考: http://www.cnblogs.com/lanqie/p/7442668.html 2.文件介绍: 其中:JniFacto ...

  9. Veins(车载通信仿真框架)入门教程(二)——调用第三方库

    Veins(车载通信仿真框架)入门教程(二)——调用第三方库 在借助Veins进行自己的研究时我们经常需要实现一些比较复杂的功能,有时就需要借助第三方库的帮助. 博主的研究需要使用神经网络,但是自己编 ...

随机推荐

  1. 取汉子拼音首字母的C#方法

    /// <summary> /// 获得一个字符串的汉语拼音码 /// </summary> /// <param name="strText"> ...

  2. Delphi 的内存操作函数(1): 给字符指针分配内存

    马上能想到的函数有: GetMem AllocMem ReallocMem FreeMem GetMemory ReallocMemory FreeMemory New Dispose NewStr ...

  3. People seldom do what they believe in. They do what is convenient, then repent.

    People seldom do what they believe in. They do what is convenient, then repent. 人们很少真正实践他们的理想.他们只做比较 ...

  4. 浅谈MySQL压缩协议细节--从源码层面

    压缩协议属于mysql通讯协议的一部分,要启用压缩协议传输功能,前提条件客户端和服务端都必须要支持zlib算法,那么,现在有个问题,假如服务端已经默认开启压缩功能,那原生客户端在连接的时候要如何才可启 ...

  5. to_char(sysdate,'D')的用法

    select to_char(sysdate,'D') from dual;   这周的第几天:Day of week (1–7) 1,2,3,4,5,6,7--注意:每星期的第1天是”星期日“ se ...

  6. long long , __int64 范围

    VC的64位整数 分别叫做__int64与unsigned __int64,其范 围分别是[-2^63, 2^63)与[0,2^64),即-9223372036854775808~9223372036 ...

  7. MySql 查询一周内记录

    本周内:select * from wap_content where week(created_at) = week(now) 查询一天:select * from table where to_d ...

  8. 让 Logo "飞" 出屏幕

    让 Logo "飞" 出屏幕   推荐序 本文介绍了一种思路,即利用矢量工具来生成动画的关键代码,然后进一步制作成完整的动画效果,感谢作者授权转载. 作者介绍:一缕殇流化隐半边冰霜 ...

  9. win10安装Anaconda+TensorFlow+配置PyCharm

    其实很简单,我这里也只是记录一下而已. 第一大坑:anaconda必须安装4.2以前的版本,不能安装4.3以后的 版本:满满的血泪史 因为我们需要安装自带的python必须是3.5,才可以调用Tens ...

  10. Python开发【2.2 异常处理】

    1.Python常见异常类型: Exception 常规错误的基类 AttributeError 对象没有这个属性 IOError 输入/输出操作失败 IndexError 序列中没有此索引(inde ...