如何在JNI项目中实现精细的功能

时间:2015-09-11 23:41:59

标签: android c java-native-interface linux-device-driver native

您好我正在尝试在JNI项目中实现以下本机代码,我有几个问题。 这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv)
{
/* Our file descriptor */
int fd;
int rc = 0;
char *rd_buf[16];
printf("%s: entered\n", argv[0]);
/* Open the device */
fd = open("/dev/hello1", O_RDWR);
if ( fd == -1 ) {
perror("open failed");
rc = fd;
exit(-1);
}
printf("%s: open: successful\n", argv[0]);
/* Issue a read */
rc = read(fd, rd_buf, 0);
if ( rc == -1 ) {
perror("read failed");
close(fd);
exit(-1);
}
printf("%s: read: returning %d bytes!\n", argv[0], rc);
close(fd);
return 0;
}

我的问题是: 1-我如何处理argv和argc?我假设大部分代码都放在我的JNI目录中的C文件中。

2-如何处理带有结构的函数作为传递给它们的参数?也就是说,不只是具有基本类型参​​数的函数,如int,boolean,String等?如何在MainActivity中实现这些结构的Android / java版本,以便在运行javah时获得相应的本机方法?所以如果我有一个使用以下作为参数的函数:

struct tbt_registered_listener_list {
    struct list_head                 list;
    struct tbt_register_listener_req svc;
    u8  *sb_reg;
    int                        rcv_req_flag;
};

相应的Java版本是什么,请进入Android主要活动吗?我是否必须在Android主活动中创建具有相同参数的类,然后运行javah?

1 个答案:

答案 0 :(得分:0)

你不会。你根本不会做这样的主要功能。这就是命令行程序的工作原理。相反,你应该用标准参数封装你需要的普通C函数。像这样直接转换它是可行的(使用字符串数组),但是非常糟糕且效率非常低。