java通过jni调用C程序接口
int pos_x;
int pos_y;
int size_x;//Width
int size_y;//Height
}
public class FbSetControl {
static {
System.loadLibrary("fbset");
}
public native int Init();
public native int SetPosition();
}
Path变量中添加 %java_home%/bin,
org_trident_app_FbSetControl.h:
#include <jni.h>
/* Header for class 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;
int uHeight;
}
#endif
#endif
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <android/log.h>
#include <org_trident_fbset_FbSetControl.h>
#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 = open( "/dev/fb0", O_RDWR ) ) < 0 )
{
printf(stderr, "open %s error!\n",DEVICE_NAME);
//return -1;
}
printf(stderr, "error FBIO_SET_POSITION screeninfo!\n");
//return -1;
}
(* env)->SetIntField(env,tparam, fid, fb_res.uWidth);
printf("uWidth is %d",fb_res.uWidth);
(* env)->SetIntField(env,tparam, fid, fb_res.uHeight);
printf("uHeight is %d",fb_res.uWidth);
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);
fb_pos.nPosY = (*env)->GetIntField(env, tparam, fid);
printf("nPosY is %d",fb_pos.nPosY);
fb_pos.nSizeX = (*env)->GetIntField(env, tparam, fid);
printf("nSizeX is %d",fb_pos.nSizeX);
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);
//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;
}
printf(stderr, "error FBIO_SET_POSITION screeninfo!\n");
//return -1;
}
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
jclass tprm = (*env)->GetObjectClass(env, tparam);
作用是拿到传递的env中我们添加的tparam结构的指针
作用是拿到tparam结构中pos_x的ID,"I"表示是int,如果我们要传递字符串变量,比如IP地址,可以这样写:
jclass tprm = (*env)->GetObjectClass(env, tparam);
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);
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
然后就可以使用ndk-build编译生成so,要做这一步,你需要安装NDK,安装步骤你可以参照:
转载于:https://blog.51cto.com/wb127/591331
java通过jni调用C程序接口相关推荐
- java调C接口_java通过jni调用C程序接口
打算写一个FbSetApp去操作framebuffer的设备文件,以便能够去设置FB的一些参数. 新建两个class FbParams.java: package org.trident.fbset; ...
- Java通过JNI调用C++的DLL库
2019独角兽企业重金招聘Python工程师标准>>> Java通过JNI实现调用C++程序 好久没碰JNI这个东西了,刚工作的时候自己写过点东西,这么些年很少用到,最近一个项目又用 ...
- Java通过JNI调用C++动态链接库dll,并打在jar包内 ——JNA-JNI(一)
Java通过JNI调用C++动态链接库dll,并打在jar包内--JNA-JNI(一) 系列文章: Java通过JNI调用C++动态链接库dll,并打在jar包内 --JNA-JNI(一) Java使 ...
- JAVA通过JNI调用C++动态链接库CLL(一)
简介 使用eclipse新建JAVA项目并生成.h头文件 新建项目JniDemo 新建测试类JniTest并声明一个native的方法 使用Javah命令生成native方法的声明的C/C++头文件 ...
- JAVA通过JNI调用C++动态链接库CLL(二)
简介 使用Visual Studio 2017新建c++动态链接库dll项目 编写JniDemo.h中getName实现并生成DLL 编写JniDemo.h在JniDemo.c实现getName方法 ...
- Java通过-jni调用c语言
Java通过-jni调用c语言 一.编写JAVA程序 二.编译h头文件 三.编写C方法实现 四.生成对象文件 五.生成动态链接库 六.执行 一.编写JAVA程序 public class TestNa ...
- java和matlab的交互实践--在java项目中调用matlab程序
本文主要解决了java项目中调用matlab程序过程中遇到的问题,下文主要分matlab的jar包部署以及java项目配置两个方面来分析. 1.matlab项目的部署 -- 生成jar包 保存matl ...
- java xfire指定参数名_Java编程中使用XFire框架调用WebService程序接口
JAVA调用webservice,当你刚开始接触的时候你会觉得它是一个恶梦,特别是没有一个统一的标准实现,比起.net的那些几步就可以完成的webservice实现,我们看着JAVA的实现真是伤心啊. ...
- java在主程序修改函数输出,Java通过JNI调用CUDA
--NG 这段时间因为工作需要,要用到在java中调用cuda程序,但是令人蛋疼的是网上这方面的资料几乎没有,所以只好我自己摸索.我的想法是通过java的JNI接口调用cuda,但是很明显正常情况下是 ...
最新文章
- 干货 :数据可视化的10个关键术语
- Git - ‘假设未改变‘和‘跳过工作树‘之间的区别
- SM04 在线用户管理(踢人事务)
- mysql如何逻辑删除_mysql逻辑删除如何恢复
- c语言高低位拷贝_C语言中的大小端转换与高低位颠倒
- 【Ubuntu引导】EFI系统分区.删除不掉,也不能格式化,如何粘力删除 efi 隐藏分区
- 查看文章strncpy()功能更好的文章
- gridview為什麼分頁後,GridView1_RowDataBound就運行不了
- LOJ6504 「雅礼集训 2018 Day5」Convex 凸包、莫队
- 递归删除文件和删除文件夹
- python按键精灵是哪个库_按键精灵命令库的介绍和使用
- 微信收款码应该怎么申请呢?详细教程在这里
- hive: Error in acquiring locks
- 【调研】DRL优化网络通信领域顶会及期刊
- YAML简介(.yml文件后缀)
- video视频设置第一帧为封面
- 论文笔记01——PoseCNN:A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes
- JAVA将英文字母的大写字母转换为小写字母。
- stm32f105vct6例程_STM32F105VCT6
- JS setTimeout延迟时间为0的详解
热门文章
- QMessageBox 使用方法
- 每日一linux命令
- INPUT[type=file]的change事件不触发问题
- 双系统,重装windows后修复linux的grub启动
- Repeater控件嵌套使用
- firefox 4b7截图
- 文本分类中的特征词选择算法系列科普(前言AND 一)
- 2019-06-12 Java学习日记之JDBC
- sbt安装、配置、運行(scala sbt helloworld)
- ImportError: No module named 'pip._vendor.retrying'