转自: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#中值类型和引用类型的差别浅记

    C#中值类型和引用类型的差别浅记         在C#中,变量的类型分为两种.各自是值类型和引用类型.         值类型的变量直接存储值,说得更详细一些,就是值类型变量在内存中直接存储它们自身 ...

  2. UVA 1482 - Playing With Stones(SG打表规律)

    UVA 1482 - Playing With Stones 题目链接 题意:给定n堆石头,每次选一堆取至少一个.不超过一半的石子,最后不能取的输,问是否先手必胜 思路:数值非常大.无法直接递推sg函 ...

  3. 将世界坐标转成NGUI坐标

    将世界坐标转成NGUI坐标,这个中间须要一个屏幕坐标,可參考例如以下代码: /// <summary> /// 将世界坐标转成UI坐标 /// </summary> /// & ...

  4. Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can&#39;t find referenced class问题的解决方式

    Warning: can't find superclass or interface Warning: can't find referenced class 这两个问题的解决方法: 1.要把你项目 ...

  5. centos安装时各个版本的含义

    Desktop :基本的桌面系统,包括常用的桌面软件,如文档查看工具.Minimal Desktop :基本的桌面系统,包含的软件更少.Minimal :基本的系统,不含有任何可选的软件包.Basic ...

  6. sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)

    sql server 关于表中只增标识问题   由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...

  7. GY的实验室 - Phalcon+Nginx+PHP-FPM环境搭建(转)

    Phalcon简介 由于半路出家的缘故,没用过几个PHP框架,第一个了解的框架是公司自己的,然后又试着用了Yii,CI.在读了CSDN在某度的高排名翻译文章(PHP开发框架流行度排名:Laravel居 ...

  8. @Transactional 无效的解决方案

    1 .在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义和接口方法.类定义和类的 public 方法上 . 2 . @Transactio ...

  9. Hero In Maze

    Hero In Maze 时间限制(普通/Java):1000MS/10000MS          执行内存限制:65536KByte 描写叙述 500年前,Jesse是我国最卓越的剑客. 他英俊潇 ...

  10. LeetCode题解(19)--Remove Nth Node From End of List

    https://leetcode.com/problems/remove-nth-node-from-end-of-list/ 原题: Given a linked list, remove the  ...