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:搞起:

  1. 新建一个android项目(这里乙方C++公司新建的是android程序,后期会转化为C++程序),名称为hello;报名为com.hello.hello如图,图中的jni和libs和obj文件夹不要管他,他们是后来自动生成的。
  2. 项目hello右键-》Android Tools-》Add Native Support-》填写你需要生成的库名称,这里写hello就行,确定之后就自动生成了jni文件夹了,里面有hello.cpp和Android.mk
  3. 在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    := helloLOCAL_SRC_FILES := hello.cppinclude $(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.cppSharedLibrary  : libhello.soInstall        : libhello.so => libs/armeabi/libhello.so
  9. 运行android项目,会看到下图,说明是正确的,至此我们编写的库文件能够被正确的被自己的程序调用,
  10. 现在项目完成,把项目中用的头文件com_hello_hello_HelloActivity.h和生成的哭文件libhello.so(在libs/armeabi 文件夹下)和接口文档交给项目经理,然后项目经理再转交给丙方android公司
  11. 去看丙方android公司的笑话去吧-------》》》[第二篇:android利用jni调用第三方库——编写库android程序直接调用第三方库libhello.so]

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



更多相关文章

  1. 让Android应用程序支持安装到SD卡
  2. 【OpenCV3.3】搭建VS2017+Android开发环境
  3. cocos2d-x学习笔记 如何将win32移植到android
  4. Android(安卓)JNI和NDK有什么区别
  5. 开源框架和开源项目
  6. Android(安卓)Manifest merger failed with multiple errors,see
  7. Android中TASK和PROCESS的区别,获取最近运行的程序和正在运行的进
  8. Android程序员指南(12)
  9. 让你明白,Android常用组件四大天王

随机推荐

  1. 怎么画漫画人物的嘴巴?漫画人物嘴巴新手教
  2. php将ppt转jpg图片的具体步骤代码
  3. Vue自定义指令详细
  4. 怎么画漫画人物的嘴巴?漫画人物嘴巴新手教
  5. android版本更新功能
  6. Android中获取当前屏幕的尺寸大小
  7. Android之获取加载图片宽高问题(getIntrin
  8. Android开发错误信息收集
  9. JS判断是IOS还是Android,判断是否微信浏览
  10. Android异步处理特性之AsyncTask