2015-09-15 182 views
0

我在網上搜索,並在這個網站上,發現this鏈接,詢問我即將到來的同一個問題,但答覆似乎並沒有解決這個問題。另外還有一個引用的鏈接丟失。基本上問題是如何有效和智能地決定何時使用jni兼容函數來處理C源代碼文件中的內容。我熟悉javah命令的作用,但該命令將JAVA方法轉換爲要使用的C頭文件。那麼已經在C源文件中實現的方法呢?你怎麼知道你是否必須將它們轉換爲JNI版本的方法?我使用過Android Studio,並把在.c的源代碼文件,它是在項目的我JNI文件夾下面的代碼:如何將C代碼轉換爲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建造編譯項目,但我沒有得到結果,我正在尋找。也就是說,我用NDK編譯的代碼的正常C版本打開驅動程序,並且能夠與它進行交互,但是這並不完全相同。我在內核日誌中看不到打印語句的結果。我不是要求某人轉換上面的代碼;而是讓我知道上述哪一行需要轉換的方法,請問做什麼是最好的方法。我已閱讀了許多有關此項目的內容,並且我很快就會加快步伐,但是如果您能夠在高層描述如何完成此轉換,請告知。我有一個Java Native Interface和一些Android文本的副本,並且儘可能快地通過它們。 謝謝

+0

_「你怎麼知道你是否必須將它們轉換爲方法的JNI版本?」_這應該更容易確定是否重新描述了自己問的問題:_是否需要從Java調用此C函數? (即不是通過一些其他的C函數,而是直接來自Java)_ – Michael

+0

我知道有人會這樣說。但問題是我甚至無法驗證任何C語句正在執行。我知道如果我需要從我的Android文件中的任何C源數據結構,我需要使用API​​。你明白我的意思嗎? – user3326293

+0

也許我誤解了一些東西,但這對我來說沒有意義。爲什麼你會寫一個函數而不知道它會在什麼情況下被調用?無論如何,你應該在''中使用日誌函數而不是printf。將stdout重定向到logcat也可能起作用,但那不是我嘗試過的。 – Michael

回答

0

我相信你需要在printf後打電話fflush(stdout);。根據this answer

+0

@巴迪 - 謝謝我現在正在嘗試。 – user3326293

+0

@ Buddy-謝謝。我想我還需要更新其他東西。我沒有看到任何輸出或日誌消息。 – user3326293

相關問題