Andoid之硬件访问服务1(让Andoid应用程序访问c库)
2024-09-06 02:02:21
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 ;
} 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 ;
} 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[])) < )
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开发板上运行,点相应按钮后会有调试信息打印
最新文章
- 【转】zigbee终端无法重连的问题解决
- 基于modelsim-SE的简单仿真流程—上
- linux系统CentOS7
- 谢欣伦 - OpenDev原创教程 - 设备查找类CxDeviceFind &; CxDeviceMapFind
- 《编写可维护的JavaScript》——JavaScript编码规范(五)
- text()和html()的区别,以及val()
- SVN版本管理系统的安装 CentOS + Subversion + Apache + Jsvnadmin
- 【转】SVN环境搭建教程
- lua metatable 和 _index 实验
- CurlSharp
- Lighttpd日志打印格式
- cocos2d-x 头文件中添加方法变量导致编译报错
- Lonely Integer
- PHP之回调函数传参(解决eval函数拼接对象参数的问题)
- Data Base mongodb高版本与低版本的区别
- 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解
- 了解一下RabbitMQ
- js实现的省市联动
- ELK - MAC环境搭建
- 基于Servlet+JSP+JavaBean开发模式的用户登录注册