我在网上搜索并在这个网站上找到this链接,询问我将要提出的相同问题,但回复似乎没有解决问题。加上其中一个引用的链接丢失了。基本上问题是你如何有效和智能地决定何时使用jni兼容函数来处理C源文件中的内容。我熟悉javah命令的作用,但该命令将JAVA方法转换为要使用的C头文件。那些已经在C源文件中实现的方法呢?你怎么知道你是否必须将它们转换为该方法的JNI版本?我正在使用Android Studio,并在项目的jni文件夹中的.c源文件中输入以下代码:
#include "com_example_sansari_usetbt_MainActivity.h"
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <android/log.h>
#define TAG "native-log-tag"
#define LOGI(LOG_TAG, ...) __android_log_print (ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGV(LOG_TAG, ...) __android_log_print (ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
#define LOGE(LOG_TAG, ...) __android_log_print (ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
/*
* Class: com_example_sansari_usetbt_MainActivity
* Method: usetbt
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_sansari_useqsee_MainActivity_Usetbt
(JNIEnv *env, jobject obj)
{
int fd;
int rc = 0;
char *rd_buf[16];
//(*env)->printf("<1>%s: entered\n", argv[0]);
printf("<1>: entered\n");
fd = open("/dev/tbt", O_RDWR);
LOGI(LOG_TAG,"This is a log test");
LOGV(LOG_TAG,"This is a log test");
LOGE(LOG_TAG,"This is a log test");
//(*env)->fd;
//return;
if ( fd == -1 ) {
perror("<1>open failed");
rc = fd;
}
printf("<1>: open: successful\n");
/* Issue a read */
rc = read(fd, rd_buf, 0);
//I need to find what fd is and then use command completion to pick a jni finction. rd-buf seems to be jstring, and 0 seems to be int
rc = (*env)->GetString
if ( rc == -1 ) {
perror("<1>read failed");
close(fd);
}
printf("<1>: read: returning %d bytes!\n",rc);
close(fd);
(*env)->NewStringUTF(env,"Hi From Usetbt version 2");
}
ndk-build编译项目,但我没有得到我想要的结果。也就是说,我用NDK编译的代码的正常C版本打开了驱动程序并且能够与它进行交互,但是这不会做同样的事情。我没有在内核日志中看到print语句的结果。我不是要求有人转换上述代码;而是告诉我如何知道上面哪些线路需要转换,请问最好的方法是什么。我已经阅读了很多关于此的内容,我很快就会加快速度,但如果你能够在高层次上描述如何 这个转换已经完成,请指教。我有一个Java Native Interface和一些Android文本的副本,我正在尽快通过它们。 感谢
答案 0 :(得分:0)
我相信你需要在printf之后调用fflush(stdout);
。根据{{3}}。