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利用jni调用第三方库——编写库libhello.so]

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

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

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    := 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项目,会看到下图,说明是正确的,至此我们编写的库文件能够被正确的被自己的程序调用,
  10. 现在项目完成,把项目中用的头文件com_hello_hello_HelloActivity.h和生成的哭文件libhello.so(在libs/armeabi 文件夹下)和接口文档交给项目经理,然后项目经理再转交给丙方android公司
  11. 去看丙方android公司的笑话去吧-------》》》[第二篇:android利用jni调用第三方库——编写库android程序直接调用第三方库libhello.so]

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

ubuntu下整合eclipse和javah生成jni头文件开发android的native程序的更多相关文章

  1. ubuntu下整合eclipse和javah生成jni头文件开发android的native程序(转)

    本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的javah命令,第二种为整合javah到eclipse里面.推荐第二种方式,方便快捷,随时修改随时生成 0:前提和条件: 1:u ...

  2. [转]ubuntu下整合eclipse和javah生成jni头文件开发android的native程序

    转载自:http://blog.csdn.net/jiuyueguang/article/details/9404237 本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的jav ...

  3. javah生成jni头文件时报错 Error: cannot access android.support...

    javah生成jni头文件时报错: Error: cannot access android.support.v7.app.AppCompatActivity class file for andro ...

  4. 使用javah生成jni 头文件和使用ndk编译so库

    1.jni 首先clean Project,在makeProject生成对应的class文件 然后点出命名框,输入命令: cd app/build/intermediates/classes/debu ...

  5. android Javah生成JNI头文件

    项目要用到c语言库,因此来学习下jni 首先是在cmd中使用javah,出现了javah不是内部或外部命令的错误提示,javah是jdk自带的工具,提示说明在系统环境变量中没有jdk的路径,或者配置错 ...

  6. Javah生成JNI头文件

    首先确保java的环境变量配置好了. 1:打开cmd 进入doc命令窗口: 进入class所在目录,我的class是在F:\summerVacation\ndkhelloworld\bin\class ...

  7. 转载: Javah生成JNI头文件出现找不到类的错误

    错误: 找不到 'com.chnic.jni.SayHellotoCPP' 的类文件. 上图可以看到错误和解决办法. 不要忘记那个点 javah -classpath . -jni com.chnic ...

  8. Java 生成 JNI 头文件

    [参考文章]:javah javac 命令行生成native的方法教程 [参考文章]:用javah 导出类的头文件, 常见的错误及正确的使用方法 项目需要调用 C++动态库,由于项目包结构发生变化,需 ...

  9. Android NDK入门实例 计算斐波那契数列一生成jni头文件

    最近要用到Android NDK,调用本地代码.就学了下Android NDK,顺便与大家分享.下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码.以及比较本地代码 ...

随机推荐

  1. linux之SQL语句简明教程---DISTINCT

    SELECT 指令让我们能够读取表格中一个或数个栏位的所有资料.这将把所有的资料都抓出,无论资料值有无重复.在资料处理中,我们会经常碰到需要找出表格内的不同资料值的情况.换句话说,我们需要知道这个表格 ...

  2. HDFS的运行原理(转载)

    原文地址:http://www.cnblogs.com/laov/p/3434917.html 简介 HDFS(Hadoop Distributed File System )Hadoop分布式文件系 ...

  3. 位运算 (&|)与--或 一位数组表示多种意思~~ 与--或

    var arr:Array = [0,1,2,4,8,16] var gate:int = 0; gate |= arr[1] gate |= arr[2] gate |= arr[3] trace( ...

  4. 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .

    3.2.    “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...

  5. 页面样式base.css

    下面是我用过多次的base.css.欢迎各种建议吐槽.大家共同进步. ;;} table{;} fieldset,img {;} address,caption, cite,code,dfn,em,s ...

  6. Fiddler 跟踪 手机页面数据包

    随着 HTML5 的急速增长,现在越来越多的人,开始涉及到移动终端的 Web 开发领域,但手机端始终没有 PC 端这么多的调试工具.即使 PC 端浏览器模拟 user-agent 进行开发,也可能会发 ...

  7. 何使用CSS写出一个下拉菜单。

    导航菜单是每个网站所必备的功能,也是每个学习制作网站的朋友所必须接触的,如何用css样式制作一个简单漂亮的二级下拉菜单呢? 下面为大家分享一下我的经验 方法步骤: 第一步  : 首页我们打开Subli ...

  8. HDU 1037 - Keep on Truckin'

    没啥可说的... #include <iostream> using namespace std; ; int a,b,c; int main() { while(cin>>a ...

  9. excel文件后台代码

    很多情况下,我们都需要从Excel中获取数据来创建Word报表文档.首先在Excel中分析数据,然后将分析结果导出到Word文档中发布.技术实现方式:1.创建Word模板,用来作为数据分析结果发布平台 ...

  10. Javascript获取当前时间戳的方法

    定义日期:   Date 对象用于处理日期和时间.   可以通过 new 关键词来定义 Date 对象.以下代码定义了名为 myDate 的 Date 对象:   var myDate=new Dat ...