当前位置:首页 > > 充电吧
[导读]需求 在上次完成的gpio控制中,把c文件编译成一个so库,供java程序调用. 准备工作 首先在网上查找了大量的资料,然后一步一步的按照网上的教程在linux平台下面走了一边,包括.jav

需求

在上次完成的gpio控制中,把c文件编译成一个so库,供java程序调用.

准备工作

首先在网上查找了大量的资料,然后一步一步的按照网上的教程在linux平台下面走了一边,包括.java文件编译成.class文件,然后生成.h文件,然后用c语言实现该方法即可.大概流程就是这样,觉得很简单.下午往android代码里面添加的时候发现很多问题.下面把详细步骤记录下来.

步骤

平台:展讯的7715,安卓7.0
java代码很简单,直接调用一个方法即可.用的还是HelloWorld示例.

System.loadLibrary(“HelloWorld”); 
class HelloWorld {
    static {
        System.loadLibrary("HelloWorld");   
    }
    private native void greeting();
    public static void main(String[] args) {
        new HelloWorld().greeting();
    } 
}

编译生成.class文件,然后通过javah HelloWorld生成.h文件,然后编写.c文件包含.h文件并实现.h文件里面的方法.

#include "HelloWorld.h"
#include 
#include 
#include 
#include 
#include 
#define DEV_IOC_MAGIC '0xee' //定义幻数


#define DEV_IOCPRINT  _IO(DEV_IOC_MAGIC, 1)
#define DEV_IO_HIGH   _IO(DEV_IOC_MAGIC, 2)
#define DEV_IO_LOW    _IO(DEV_IOC_MAGIC, 3)

#define DEV_IOC_MAXNR 3

JNIEXPORT void JNICALL Java_HelloWorld_greeting
  (JNIEnv *env, jobject obj) {
    printf("Hello World!");
    int cmd;
    int fd;
    int choice = 0;
    fd = open("/dev/dsx", O_RDWR);
    if(fd < 0)
        printf("ni  haishi  dabukai  ya !n");
    /*命令1:打印串口信息*/
    while(1)
    {
        int i=0;

        printf("Please input choice: n 1: DEV_IOCPRINT; n 2: DEV_IO_HIGHn 3: DEV_IO_LOW n 4: EXIT n");
        scanf("%d", &choice);
        if(choice == 4)
        {
            printf("gpio test exitn");
            break;
        }
        switch(choice)
        {
            case 1:
            {
                printf("<--- Call DEV_IOCPRINT --->n");
                cmd = DEV_IOCPRINT;
                if (ioctl(fd, cmd) < 0)
                {
                    printf("Call cmd MEMDEV_IOCPRINT failn");
                }
                break;
            }
            case 2:
            {
                printf("<--- Call DEV_IO_HIGH --->n");
                cmd = DEV_IO_HIGH;
                if (ioctl(fd, cmd) < 0)
                {
                    printf("Call cmd DEV_IO_HIGH failn");
                }
                break;
            }
            case 3:
            {
                printf("<--- Call DEV_IO_LOW --->n");
                cmd = DEV_IO_LOW;
                if (ioctl(fd, cmd) < 0)
                {
                    printf("Call cmd DEV_IO_LOW failn");
                }
                break;
            }
            default:
                break;
        }
        printf("nn===================================n");
    }

}

直接把原来的代码里面的main函数放到了Java_HelloWorld_greeting里面.
本以为这样就可以了,但是编译生成的so库放到开发板里面怎么都不行,经过师傅的讲解以后(下面的步骤很关键哦),在external下面新建一个文件夹,然后把.c文件和.h文件放进来,最重要的是要写一个Android.mk文件.然后编译安卓源代码就可以了.

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_ARM_MODE :=arm

LOCAL_MODULE := **libHelloWorld**//一定要加上lib
LOCAL_SRC_FILES := HelloWorld.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(BUILD_SHARED_LIBRARY)

然后编译该目录,会在system/bin下面生成libHelloWorld.so.这个才是最终生成的so文件,把它push进开发板的system/lib目录下面,然后在开发板中运行刚才写的java代码生成的.class就可以了.

感悟

这个任务其实挺简单的,多查资料,实在搞不明白的问问师傅,很快就可以解决.

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

链表作为一种基础的数据结构,在程序设计中扮演着重要角色。掌握链表的高效操作技巧,特别是逆序、合并和循环检测,对于提升算法性能和解决复杂问题至关重要。本文将详细介绍这些操作的C语言实现,并分析其时间复杂度。

关键字: 链表 C语言

在C/C++多文件编程中,静态变量(static)与全局变量的作用域规则看似简单,实则暗藏诸多陷阱。开发者若未能准确理解其链接属性与生命周期,极易引发难以调试的内存错误、竞态条件以及维护灾难。本文将深入剖析这两类变量的作...

关键字: 静态变量 全局变量 C语言

在嵌入式系统和服务器开发中,日志系统是故障排查和运行监控的核心组件。本文基于Linux环境实现一个轻量级C语言日志库,支持DEBUG/INFO/WARN/ERROR四级日志分级,并实现按大小滚动的文件轮转机制。该设计在某...

关键字: C语言 嵌入式系统

在嵌入式系统和底层驱动开发中,C语言因其高效性和可控性成为主流选择,但缺乏原生单元测试支持成为开发痛点。本文提出一种基于宏定义和测试用例管理的轻量级单元测试框架方案,通过自定义断言宏和测试注册机制,实现无需外部依赖的嵌入...

关键字: C语言 嵌入式系统 驱动开发

在嵌入式系统开发中,实时操作系统(RTOS)的任务调度算法直接影响系统的响应速度和资源利用率。时间片轮转(Round-Robin, RR)作为一种经典的公平调度算法,通过为每个任务分配固定时间片实现多任务并发执行。本文将...

关键字: 实时操作系统 RTOS C语言

在Linux设备驱动开发中,等待队列(Wait Queue)是实现进程睡眠与唤醒的核心机制,它允许进程在资源不可用时主动放弃CPU,进入可中断睡眠状态,待资源就绪后再被唤醒。本文通过C语言模型解析等待队列的实现原理,结合...

关键字: 驱动开发 C语言 Linux

在嵌入式系统开发中,C语言与汇编的混合编程是优化性能、访问特殊指令或硬件寄存器的关键技术。然而,内联汇编的语法差异和寄存器使用规则常导致难以调试的问题。本文以ARM Cortex-M和x86架构为例,系统梳理内联汇编的核...

关键字: C语言 汇编混合编程

在计算机安全领域,缓冲区溢出攻击长期占据漏洞利用榜首。这种攻击通过向程序缓冲区写入超出其容量的数据,覆盖相邻内存区域(如返回地址),进而实现任意代码执行。本文将深入探讨栈保护机制与安全函数(如snprintf)的集成防御...

关键字: 栈保护 安全函数 C语言

在嵌入式系统和大规模数值计算等性能敏感场景中,程序优化是提升效率的关键环节。gprof作为GNU工具链中的性能分析工具,能够精准定位CPU时间消耗热点。本文通过实际案例演示gprof的三个核心使用步骤,帮助开发者快速识别...

关键字: C语言 gprof 热点函数

哈希表作为高效数据检索的核心结构,其性能高度依赖冲突解决策略。本文通过C语言实现对比链地址法与开放寻址法,揭示两种方法在内存占用、查询效率及实现复杂度上的差异,为工程实践提供量化参考。

关键字: 哈希表 链地址法 开放寻址法 C语言
关闭