如何将C代码转换为兼容JNI的C代码?

时间:2015-09-15 17:01:33

标签: android java-native-interface

我在网上搜索并在这个网站上找到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文本的副本,我正在尽快通过它们。 感谢

1 个答案:

答案 0 :(得分:0)

我相信你需要在printf之后调用fflush(stdout);。根据{{​​3}}。