Andoid之硬件訪問服務1(讓Andoid應用程序訪問c庫)
阿新 • • 發佈:2017-10-08
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庫)