转自: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 = -1;          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]

更多相关文章

  1. Android小程序-模拟小球平抛落地反弹到静止过程
  2. 详解OkSocket与Android的简单使用
  3. Android使用KSOAP2调用WebService及正确导入jar包的问题
  4. 桌面便签程序的实现详解和源码 (上)
  5. 可以显示九天天气情况的天气预报哦-LINUX下JAVA自制服务器端,申请
  6. Android:通过build gradle中的buildTypes设置自动log开关(二)
  7. Android(安卓)Studio 项目混淆打包时,报错Caused by: java.lang.N
  8. 【5年Android从零复盘系列之六】Android自定义View(1):基础
  9. 回首2019 展望2020 ——我的程序员之路

随机推荐

  1. Android中的11种传感器
  2. 电话文本android(3)_拨打电话操作
  3. 独辟蹊径系列 带着大家玩Android
  4. APK安装过程详解
  5. android讲义2之计时器组件Chronometer
  6. Android(安卓)studio xml 无提示解决办法
  7. Android设置Activity全屏的三种方式
  8. Android Studio编译后报错 java.exe'' fi
  9. android:保存bitmap
  10. [Android] 任意时刻从子线程切换到主线程