• Andoid之硬件访问服务1(让Andoid应用程序访问c库)


     

    andoid 项目文件结构图

    新建Hardcontrol.java

    package com.thisway.hardlibrary;
    
    public class HardControl {
        public static native int ledCtrl(int which, int status);
        public static native int ledOpen();
        public static native void ledClose();
    
        static {
            try {
                System.loadLibrary("hardcontrol");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    访问C库

      1.修改build.gradle

    sourceSets {  
            main {  
                jniLibs.srcDirs = ['libs']  
            }  
        }  
    

      新建hardcontrol.c文件

    #include <jni.h>    /* /usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ */
    #include <stdio.h>
    #include <stdlib.h>
    
    #include <android/log.h>  /* android log*/
    
    
    
    #if 0
     typedef struct {
        char *name;          /* Java里调用的函数名 */
        char *signature;    /* JNI字段描述符, 用来表示Java里调用的函数的参数和返回值类型 */
        void *fnPtr;          /* C语言实现的本地函数 */
    } JNINativeMethod;
    #endif
    
    jint ledOpen(JNIEnv *env, jclass cls)
    {   __android_log_print(ANDROID_LOG_DEBUG, "JNIDemo", "native add ...");
        __android_log_print(ANDROID_LOG_DEBUG, "LEDDemo", "native ledOpen......");
        return 0;
    }
    
    void ledClose(JNIEnv *env, jclass cls)
    {
        __android_log_print(ANDROID_LOG_DEBUG, "LEDDemo", "native ledClose......");
    }
    
    jint ledCtrl(JNIEnv *env, jclass cls,jint which, jint status)
    {
        __android_log_print(ANDROID_LOG_DEBUG, "LEDDemo", "native ledCtrl: %d,  %d",which, status);
    
        return 0;
    }
    
    static const JNINativeMethod methods[] = {
        {"ledOpen", "()I", (void *)ledOpen},
        {"ledClose", "()V", (void *)ledClose},
        {"ledCtrl", "(II)I", (void *)ledCtrl},
    };
    
    /* System.loadLibrary */
    JNIEXPORT jint JNICALL
    JNI_OnLoad(JavaVM *jvm, void *reserved)
    {
        JNIEnv *env;
        jclass cls;
    
        if ((*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_4)) {
            return JNI_ERR; /* JNI version not supported */
        }
        cls = (*env)->FindClass(env, "com/thisway/hardlibrary/HardControl");
        if (cls == NULL) {
            return JNI_ERR;
        }
    
        /* 2. map hello java<-->c c_hello */
        if((*env)->RegisterNatives(env, cls, methods, sizeof(methods) / sizeof(methods[0])) < 0)
            return JNI_ERR;
        
        return JNI_VERSION_1_4;
    }

       2.编译so文件

    arm-linux-gcc -fPIC -shared hardcontrol.c -o libhardcontrol.so 
    -I /usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ 
    -nostdlib /work/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/lib/libc.so
    -I /work/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/include
    /work/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/lib/liblog.so

       3.在app/libs下建armeabi子目录,放入so文件

     在4412开发板上运行,点相应按钮后会有调试信息打印

  • 相关阅读:
    docker 的端口映射
    Python OpenCV实现图像模板匹配详解
    async和await用法(Task)
    C#,哈夫曼编码(Huffman Code)压缩(Compress )与解压缩(Decompress)算法与源代码
    python opencv轮廓检测
    Docker 创建镜像、修改、上传镜像
    C# .NET4.0 自定义文件并实现文件与应用程序关联
    How to Assign a Custom Icon to a File Type
    【服务器数据恢复】服务器误删除KVM虚拟机的数据恢复案例
    【服务器数据恢复】OceanStor存储中NAS卷数据丢失的数据恢复案例
  • 原文地址:https://www.cnblogs.com/CZM-/p/7636028.html
Copyright © 2020-2023  润新知