你好,游客 登录 注册 搜索
背景:
阅读新闻

Android源码中编译自己的so库

[日期:2013-02-04] 来源:CSDN  作者:liudekuan [字体: ]

我们知道,Android架构中上层应用是以java来编写的,而底层则用C/C++编写。一般而言,上层android工程师在开发过程中,不会或很少涉及到C/C++层,但项目中一旦涉及到复杂的算法或耗时操作时(例如图像处理等),通常使用C/C++完成算法实现并提供给java层(通过JNI)调用,以此提升软件的运行效率。在这个过程中,C/C++所实现的代码以及JNI调用相关的代码被打包为.so库,这即是所谓的目录设备上的二进制动态库(SHARED LIBRARY)。本文在android源码平台(Ubuntu)下编写了一个小程序:由上层JAVA代码通过JNI调用底层C/C++代码(.so库),完成加法运算的操作。注意,对于不具备源码环境的情况下,GOOGLE提供了NDK工具以完成C/C++层的开发,关于NDK配置使用不在本文讨论范围内。

1 JAVA层的开发

首先给出程序的运行效果图,如下所示:

图1 运行效果截图

在两个输入框中分别输入两个数字(45,35),点击"Confirm"则在上面显示出运算结果(sum = 80)。此过程中,加法操作用C代码实现。整个工程的根目录路径设置如下:

图2 Helloworld根目录

我们需要关注jni目录,此目录下包含着C/C++相关的代码。

1.1 MainActivity.java

package com.eton.helloworld;

import android.os.Bundle;

import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

        private TextView tvSum;
        private EditText etAdd1;
        private EditText etAdd2;
        private Button btnConfirm;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvSum = (TextView) findViewById(R.id.tv_sum);
        etAdd1 = (EditText) findViewById(R.id.et_add1);
        etAdd2 = (EditText) findViewById(R.id.et_add2);
        btnConfirm = (Button) findViewById(R.id.bt_Confirm);

        System.loadLibrary("jnicall");

        btnConfirm.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                int add1 = Integer.parseInt(etAdd1.getText().toString());
                int add2 = Integer.parseInt(etAdd2.getText().toString());
                tvSum.setText("sum = " + add(add1, add2));
            }
        });

    }

    public native int add(int add1, int add2);
}

代码29行:显式加载.so类库--libjnicall--我们自己的类库,注意,代码中为"jnicall",对应的是类库libjnicall.so;

代码43行:通过关键字native声明本地函数add,此函数为C/C++实现;

代码37行:调用本地函数add。

linux
本文评论   查看全部评论 (2)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
第 2 楼
* 匿名 发表于 2013/10/8 11:06:00
你这个坑爹的讲解,请讲重点啊!
第 1 楼
* 匿名 发表于 2013/5/4 14:41:02
楼主你好!

你这个办法是使用了自己所创造出来的共享库。

但是我现在有一个问题就是:如果我想要使用别人的共享库,比如我想要使用一个第三方的协议栈共享库,那么我改如何把这个第三方的库添加到项目中去呢?

换句话说就是:

因为是第三方的库,所以不可能像楼主你那样的步骤来产生相应的JNI,那么我改如何去添加第三方共享库到项目中去呢?


望回复!