从源码编译Android系统的Java类库和JNI动态库的方法

利用源码编译Android系统Java类库
1、编写Java项目和Android.mk文件

  ├── Android.mk
  └── src
   └── com
     └── lhw
       └── framework
         └── led
           └── Led.java

Led.java文件

package com.lhw.framework.led; 

/**
 * LED操作库
 * @author Micky Liu
 */
public class Led { 

  public boolean turnOn() {
    return true;
  }   

  public boolean turnOff() {
    return true;
  }
} 

Android.mk文件

LOCAL_PATH := $(call my-dir) 

LOCAL_SRC_FILES   := $(call all-java-files-under, src)
LOCAL_MODULE    := framework_led
LOCAL_MODULE_TAGS  := framework_led 

LOCAL_JAVA_LIBRARIES    :=
LOCAL_STATIC_JAVA_LIBRARIES := 

include $(BUILD_JAVA_LIBRARY)

2、编译

   mmm /home/administrator/workspace/android_test/framework_led

编译结果:

   Install: out/target/product/generic/system/framework/framework_led.jar

利用源码编译Android系统JNI动态库
1、代码和Android.mk编写

├── jni
│  ├── Android.mk
│  └── led.c

led.c

#include <jni.h>
#include <stdio.h> 

jboolean Java_com_lhw_led_Led_turnOn(JNIEnv *env, jclass thiz)
{
  return JNI_TRUE;
} 

jboolean Java_com_lhw_led_LED_trunOff(JNIEnv *env, jclass thiz)
{
  return JNI_TRUE;
}

注:方法名命名规则为:Java_包名_类名_方法名,可以用javah 命令根据java文件生成所需要的.h头文件。当然更好的办法是通过JNI_OnLoad和AndroidRuntime::registerNativeMethods实现动态注册,这样可以不用理会方法名规则。这里只是做个简单的例子,在后面会用一个例子实现动态注册。

Android.mk

LOCAL_PATH := $(call my-dir) 

LOCAL_SRC_FILES := led.c
LOCAL_MODULE  := led_jni
LOCAL_MODULE_TAGS    := led_jni 

LOCAL_PRELINK_MODULE  := false
LOCAL_SHARED_LIBRARIES := libc 

include $(BUILD_SHARED_LIBRARY)

2、编译

  mmm /home/administrator/workspace/android_test/jni

编译结果:

  Install: out/target/product/generic/system/lib/led_jni.so
(0)

相关推荐

  • Ubuntu 使用Jni开发实例详解

    1. 编写Java文件,在其中声明native方法, 并通过static 语句块加载动态链接库,示例Prompt.java代码如下: class Prompt { private native String getLine(String prompt); public static void main(String args[]) { Prompt p = new Prompt(); String input = p.getLine("Type a line: "); System.o

  • 较详细的JNI简介

    在Java中,有时候我们不得不要去使用其他语言的代码,比如说: 1.你的应用需要访问系统的各个特性和设备,这些特性和设备通过java平台是无法访问的. 2.你已经有了大量的测试过和调试过的用另一种语言编写的代码,并且知道如何将其导出到所有的目标平台上. 3.通过基础测试,你已经发现所编写的Java代码比用其他语言编写的等价代码要慢得多. Java平台有一个用于和本地C代码进行互操作的API,称为Java本地接口(JNI).现在就开始学习JNI,先从这篇的一个最简单的例子,了解如何使用JNI调用本

  • Java的JNI快速入门教程(推荐)

    1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时性要求高的地方目前还未涉及,实时性这类话题有待考究). 解决办法:Java使用JNI可以调用现有的本地库(C/C++开发任何和系统相关的程序和类库),极大地灵活Java的开发. 2. JNI快速学习教程 2.1 问题: 使用JNI写一段代码,实现string_Java_Test_helloworld

  • 启动 Eclipse 弹出 Failed to load the JNI shared library jvm.dll 错误的解决方法

    错误如下图所示: 有时候,新电脑上回碰到打开Eclipse时,弹出提示"Failed to load the JNI shared library jvm.dll"错误,这里给大家分享解决方案. 通常情况下,如果你是64位的系统,却安装了32位的JDK,就会导致上面的情况. 解决办法 1.卸载掉原来安装的32位的JDK,然后安装64位的JDK到电脑中. 2.重新修改path 和 classpath 两个环境变量.因为在64系统当中,32位软件回安装到program files (*86

  • Android通过JNI实现守护进程

    开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国内各大厂商的ROM,还需要应对各类的安全管家...虽然不断的研究各式各样的方法,但是效果并不好,比如任务管理器把App干掉,服务就起不来了... 网上搜寻一番后,主要的方法有以下几种方法,但都是治标不治本: 1.提高Service的优先级:这个,也只能说在系统内存不足需要回收资源的时候,优先级较高,不容易被回收,然并卵... 2.提高Service所在进程的优先级:效果不是很明显 3.在onDestroy方法里重启service:

  • 从源码编译Android系统的Java类库和JNI动态库的方法

    利用源码编译Android系统Java类库 1.编写Java项目和Android.mk文件 ├── Android.mk └── src └── com └── lhw └── framework └── led └── Led.java Led.java文件 package com.lhw.framework.led; /** * LED操作库 * @author Micky Liu */ public class Led { public boolean turnOn() { return

  • 利用源码编译Android系统的APK和可执行命令的方法

    编译Android系统APK 1.设置环境 export ANDROID_HOME=/home/administrator/soft/android export PATH=$PATH:$ANDROID_HOME/out/host/linux-x86/bin export ANDROID_PRODUCT_OUT=$ANDROID_HOME/out/target/product/generic 2.创建项目 android create project -t 1 -k com.lhw.led -a

  • Ubantu16.04进行Android 8.0源码编译的流程

    分为4个流程 源码下载 构建编译环境 编译源码 运行 源码下载 安装git并且配置 //安装git sudo apt-get install git //配置git名称和邮箱 git config --global user.name "your name" git config --global user.email XXX@XXX.com 创建repo的bin目录和源码目录 1.创建repo的bin目录 midir ~/bin 2.创建源码目录 midir ~/source 安装r

  • 解决Android 源码编译错误的问题

    如下所示: Building with Jack: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp Out of memory error (version 1.2-a

  • Mac系统下源码编译安装MySQL 5.7.17的教程

    1.下载并解压到:/Users/xiechunping/Softwares/mysql-5.7.17 下载地址:http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-5.7/mysql-boost-5.7.17.tar.gz 2.进入mysql-5.7.17,执行cmake cd ../mysql-5.7.17 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/tmp/mys

  • Ubuntu 17.04系统下源码编译安装opencv的步骤详解

    前言 本文主要针对Ubuntu 17.04版本下,opencv进行源码编译安装.开发环境主要针对python 对 openCV库的调用.下面话不多说了,来一起看看详细的介绍: 一.安装 gcc cmake 编译环境 sudo apt-get install build-essential pkg-config cmake cmake-gui 本文提供两种源码编译方式,一种是cmake命令,另一种是通过图形界面的cmake-gui进行编译 该版本系统ubuntu已经自带python 2.7 和 p

  • Windows环境IDEA下Ranger1.2.0源码编译详细流程

    目录 一.本地环境准备 二.源码编译 三.使用idea打开项目 1. 安装数据库Mysql版 2. 配置Tomcat,发布 security-admin-web项目. 3. 修改security-admin中以下文件 4. 编译启动Tomcat即可. 四.遇到问题 Apache Ranger是什么,它是一个为Hadoop平台提供了全面的数据安全访问控制及监控的集中式管理框架,Apache顶级项目.不废话了,其实本篇没那么高大上,就是一步步教你Windows环境IDEA下Ranger1.2.0源码

  • Linux CentOS 7源码编译安装PostgreSQL9.5

    之前的博客记录了通过rpm包的形式安装PostgreSQL 9.3(Linux CentOS 7 安装PostgreSQL 9.3(发行版本) ),本篇blog将记录一下通过源码编译的形式安装PostgreSQL 9.5. 下载 在postgresql的官方即可找到源码文件目录,地址如下:https://www.postgresql.org/ftp/source/,在下载列表中根据需求选择版本,如下图: 进入子目录后,可以看到文件列表: 如上图,可以看到提供了两种压缩格式,此处我们选择postg

  • CentOS 6.3 安装配置Apache2.2.6的方法(源码编译安装)

    安装说明 安装环境:CentOS-6.3 安装方式:源码编译安装 软件:httpd-2.2.6.tar.gz | pcre-8.32.tar.gz | apr-1.4.6.tar.gz | apr-util-1.5.1.tar.gz 下载地址:http://mirror.bjtu.edu.cn/apache/httpd/ http://apr.apache.org/download.cgi http://jaist.dl.sourceforge.net/project/pcre/pcre 安装位

  • CentOS 6.6 源码编译安装MySQL 5.7.18教程详解

    一.添加用户和组 1.添加mysql用户组 # groupadd mysql 2.添加mysql用户 # useradd -g mysql -s /bin/nologin mysql -M 二.查看系统中是否安装mysql,如果安装需要卸载 # rpm -qa | grep mysql mysql-libs-5.1.73-3.el6_5.x86_64 # rpm -e mysql-libs-5.1.73-3.el6_5.x86_64 --nodeps 三.安装所需依赖包 # yum -y ins

随机推荐