1. 程式人生 > >Andoid之硬件訪問服務1(讓Andoid應用程序訪問c庫)

Andoid之硬件訪問服務1(讓Andoid應用程序訪問c庫)

es2017 項目 ktr 按鈕 jint 開發板 height eight sign

技術分享

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開發板上運行,點相應按鈕後會有調試信息打印

Andoid之硬件訪問服務1(讓Andoid應用程序訪問c庫)