java调C接口_java通过jni调用C程序接口
打算写一个FbSetApp去操作framebuffer的设备文件,以便能够去设置FB的一些参数。
新建两个class
FbParams.java:
package org.trident.fbset;
public class FbParams {
int pos_x;
int pos_y;
int size_x;//Width
int size_y;//Height
}
用于传递FB起始位置和大小的参数。
FbSetControl.java:
package org.trident.fbset;
public class FbSetControl {
static {
System.loadLibrary("fbset");
}
public native int Init();
public native int SetPosition();
}
然后在FbSetApp下,执行:
javac -d bin src\org\trident\app\FbParams.java
javac -d bin src\org\trident\app\FbSetControl.java
然后转到FbSetApp\bin\classes下
javah -d ../../jni org.trident.app.FbSetControl
这样就会在FbSetApp\jni目录下生成org_trident_app_FbSetControl.h:
如果报文件无法访问和找不到类,那么多半是环境变量设置有问题:
java_home:C:\Program Files\Java\jdk1.7.0_01(java安装好后的路径),
Path变量中添加 %java_home%/bin,
classpath:.;%java_home%/lib
加入我们自己要用到的结构cnxtfb_position
org_trident_app_FbSetControl.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class org_trident_fbset_FbSetControl */
#ifndef _Included_org_trident_fbset_FbSetControl
#define _Included_org_trident_fbset_FbSetControl
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_trident_fbset_FbSetControl
* Method: Init
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_org_trident_fbset_FbSetControl_Init
(JNIEnv *, jobject);
/*
* Class: org_trident_fbset_FbSetControl
* Method: GetResolution
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_org_trident_fbset_FbSetControl_GetResolution
(JNIEnv *, jobject, jobject tparam);
/*
* Class: org_trident_fbset_FbSetControl
* Method: SetPosition
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_org_trident_fbset_FbSetControl_SetPosition
(JNIEnv *, jobject, jobject tparam);
typedef struct _cnxtfb_position{
int nPosX;
int nPosY;
int nSizeX;
int nSizeY;
}cnxtfb_position;
typedef struct _cnxtfb_resolution{
int uWidth;
int uHeight;
}cnxtfb_resolution;
#ifdef __cplusplus
}
#endif
#endif
在FbSetApp/jni创建一个C文件,org_trident_fbset_FbSetControl.c:
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "/dev/fb0" //device point
#define FBIO_SET_POSITION 0x4637
#define FBIO_GETFBRESOLUTION 0x4626
#define OMX_HAL_IOCTL_SET_SCREEN_POS_HW_CURSOR 0x12
static cnxtfb_position fb_pos;
static cnxtfb_resolution fb_res;
//#define DBG 0
#define LOG_TAG "fbset"
#define printf(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: FbSetControl
* Method: Init
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_org_trident_fbset_FbSetControl_Init
(JNIEnv * env, jobject obj)
{
fb_pos.nPosX = 0;
fb_pos.nPosY = 0;
fb_pos.nSizeX = 0;
fb_pos.nSizeX = 0;
printf("%d %d,%d %d",fb_pos.nPosX,fb_pos.nPosY,fb_pos.nSizeX,fb_pos.nSizeY);
}
/*
* Class: FbSetControl
* Method: GetResolution
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_org_trident_fbset_FbSetControl_GetResolution
(JNIEnv * env, jobject obj, jobject tparam)
{
jfieldID fid;
jclass tprm = (*env)->GetObjectClass(env, tparam);
static int fbfd = -1;
if (fbfd < 0)
{
if ( ( fbfd = open( "/dev/fb0", O_RDWR ) ) < 0 )
{
printf(stderr, "open %s error!\n",DEVICE_NAME);
//return -1;
}
if (ioctl(fbfd, FBIO_GETFBRESOLUTION, &fb_res)) {
printf(stderr, "error FBIO_SET_POSITION screeninfo!\n");
//return -1;
}
fid = (*env)->GetFieldID(env, tprm, "width", "I");
(* env)->SetIntField(env,tparam, fid, fb_res.uWidth);
printf("uWidth is %d",fb_res.uWidth);
fid = (*env)->GetFieldID(env, tprm, "height", "I");
(* env)->SetIntField(env,tparam, fid, fb_res.uHeight);
printf("uHeight is %d",fb_res.uWidth);
close(fbfd);
fbfd=-1;
}
}
JNIEXPORT jint JNICALL Java_org_trident_fbset_FbSetControl_SetPosition
(JNIEnv * env, jobject obj, jobject tparam)
{
jfieldID fid;
jclass tprm = (*env)->GetObjectClass(env, tparam);
static int fbfd = -1;
static int cursorfd = -1;
fid = (*env)->GetFieldID(env, tprm, "pos_x", "I");
fb_pos.nPosX = (*env)->GetIntField(env, tparam, fid);
printf("nPosX is %d",fb_pos.nPosX);
fid = (*env)->GetFieldID(env, tprm, "pos_y", "I");
fb_pos.nPosY = (*env)->GetIntField(env, tparam, fid);
printf("nPosY is %d",fb_pos.nPosY);
fid = (*env)->GetFieldID(env, tprm, "size_x", "I");
fb_pos.nSizeX = (*env)->GetIntField(env, tparam, fid);
printf("nSizeX is %d",fb_pos.nSizeX);
fid = (*env)->GetFieldID(env, tprm, "size_y", "I");
fb_pos.nSizeY = (*env)->GetIntField(env, tparam, fid);
printf("%d %d,%d %d",fb_pos.nPosX,fb_pos.nPosY,fb_pos.nSizeX,fb_pos.nSizeY);
#ifdef DBG
//printf("%d %d,%d %d",fb_pos.nPosX,fb_pos.nPosY,fb_pos.nSizeX,fb_pos.nSizeY);
#else
if (fbfd < 0)
{
if ( ( fbfd = open( "/dev/fb0", O_RDWR ) ) < 0 )
{
printf(stderr, "open %s error!\n",DEVICE_NAME);
//return -1;
}
if (ioctl(fbfd, FBIO_SET_POSITION, &fb_pos)) {
printf(stderr, "error FBIO_SET_POSITION screeninfo!\n");
//return -1;
}
close(fbfd);
fbfd=-1;
}
if (cursorfd < 0)
{
if ((cursorfd = open("/dev/HW_CURSOR", O_RDWR))<0)
{
printf("Failed to open HD cursor node warnerye.\n");
//return ;
}
if(ioctl(cursorfd, OMX_HAL_IOCTL_SET_SCREEN_POS_HW_CURSOR, &fb_pos) < 0)
{
printf("change Cursor FB POSITION failed: %s\n", strerror(errno));
close(cursorfd);
cursorfd = -1;
//return;
}
close(cursorfd);
cursorfd=-1;
}
#endif
}
#ifdef __cplusplus
}
#endif
对于jni部分参数传递的方法,在此有必要说明一下:
jfieldID fid;
jclass tprm = (*env)->GetObjectClass(env, tparam);
作用是拿到传递的env中我们添加的tparam结构的指针
fid = (*env)->GetFieldID(env, tprm, "pos_x", "I");
作用是拿到tparam结构中pos_x的ID,"I"表示是int,如果我们要传递字符串变量,比如IP地址,可以这样写:
const char *ip;
jfieldID fid;
jstring jstr;
jclass tprm = (*env)->GetObjectClass(env, tparam);
fid = (*env)->GetFieldID(env, tparam, "ipadd", "Ljava/lang/String;");
jstr = (*env)->GetObjectField(env,tparam, fid);
ip = (*env)->GetStringUTFChars(env, jstr, NULL);
//strcpy(param.pszSrcAddr,ip);
(*env)->ReleaseStringUTFChars(env,jstr,ip);
printf("ip is %s",params.pszSrcAddr);
然后再增加一个Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := fbset
LOCAL_SRC_FILES := org_trident_fbset_FbSetControl.c
LOCAL_C_INCLUDES := inc
LOCAL_LDLIBS := -lm -llog -ljnigraphics
LOCAL_LDLIBS += -LD:/Android/workspace/fbset/jni/lib
include $(BUILD_SHARED_LIBRARY)
然后就可以使用ndk-build编译生成so,要做这一步,你需要安装NDK,安装步骤你可以参照:
安装完成以后你就可以在cygwin下面编译jni部分的代码生成so文件了。
java调C接口_java通过jni调用C程序接口相关推荐
- java通过jni调用C程序接口
打算写一个FbSetApp去操作framebuffer的设备文件,以便能够去设置FB的一些参数. 新建两个class FbParams.java: package org.trident.fbset; ...
- java jni调用dll文件_Java通过jni调用动态链接库
(1)JNI简介 JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++).从Java1.1开始,JNI标准成为java ...
- java 调用c效率高_java通过JNI调用C语言写的函数,能提高运行效率吗?
C语言比Java快早就是公认的事实了.而Java可以通过JNI调用C语言写的库很多人也都知道. 但通过JNI调用C语言写的函数能提高效率吗?一直以来我都认为 是的 .昨晚心血来潮做了个测试,本意是想看 ...
- java调用可执行程序 开销_java – 进行JNI调用的定量开销是多少?
快速分析器测试产量: Java类: public class Main { private static native int zero(); private static int testNativ ...
- java调取对方接口_java中如何调用对方接口
调用对方http接口步骤:URL url = new URL(path); 1.打开和url之间的连接HttpURLConnection conn = (HttpURLConnection) url. ...
- java jni dll路径_Java中Jni调用DLL文件试验
Java中Jni调用DLL文件试验 下面是小编整理的Java中Jni调用DLL文件试验内容,希望可以为您带来帮助!更多内容请关注应届毕业生考试网! 所有文件均在E:\路径下. 安装jdk1.6.0_0 ...
- java调用远程 接口_java通过url调用远程接口返回json数据
java通过url调用远程接口返回json数据,有用户名和密码验证, 转自 https://blog.csdn.net/wanglong1990421/article/details/78815856 ...
- java xfire指定参数名_Java编程中使用XFire框架调用WebService程序接口
JAVA调用webservice,当你刚开始接触的时候你会觉得它是一个恶梦,特别是没有一个统一的标准实现,比起.net的那些几步就可以完成的webservice实现,我们看着JAVA的实现真是伤心啊. ...
- java 抽象类继承抽象类_Java之继承、抽象类、接口篇
一.继承(extends) 什么是继承? 继承是对现实生活中的"分类"概念的一种模拟. 狮子拥有动物的一切基本特性,但同时又拥有自己的独特的特性,这就是"继承" ...
最新文章
- 机器学习中的集成学习模型实战完整讲解
- 好东西+php,推荐个好东西swoole,php如虎添翼
- 希尔排序c语言,希尔排序(C/C++实现)
- java实现对大文件切割下载_Java实现大文件的切割与合并操作示例
- 缩略图修复_如何解决SOLIDWORKS不显示缩略图预览的方法?
- HQL左外连接及排序
- 数字IC手撕代码--投票表决器
- EhCache的使用
- mbedtls 自带SSL demo调试
- VSCODE也可以进行gtest细粒度测试
- 获取句子迷的经典语录[Python版本]
- The All-purpose Zero-HDU5773
- 华为手机设置5G调试
- MySQL原理与学习
- 设计模式详解:Singleton(单例类)
- 使用rust的image库进行图片压缩
- 软著申请材料,软著申请文件,软著登记材料,软著登记文件
- 微信小程序:会议OA项目-首页
- IDEA/AndroidStudio 一键为项目中所有文件添加copyright
- java simp,java – 自动装配SimpMessagingTemplate
热门文章
- xml文件导入mysql_如何使用XML_LOAD()将XML文件导入MySQL数据库表;功能?mysql-问答-阿里云开发者社区-阿里云...
- java注解字段类型相同_《java基础学习之——重复注解》
- mysql all语法怎么用_MySQL UNION 与 UNION ALL 语法与用法
- Fliptile(状压+思维)
- Distinct Characters Queries CodeForces - 1234D(线段树求区间字母种类数)
- Master of GCD(差分数组||线段树)
- swift 过滤字符串_使用Swift提取字符串中的最后一个单词
- k8s ready 不调度_从零开始学K8s: 10.在K8s上运行应用
- ddr读时序波形_测试新体验|如何解决DDR内存系统测试难题?
- 【算法竞赛学习】气象海洋预测-Task2 数据分析