我在網上搜索,並在這個網站上,發現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文本的副本,並且儘可能快地通過它們。 謝謝
_「你怎麼知道你是否必須將它們轉換爲方法的JNI版本?」_這應該更容易確定是否重新描述了自己問的問題:_是否需要從Java調用此C函數? (即不是通過一些其他的C函數,而是直接來自Java)_ – Michael
我知道有人會這樣說。但問題是我甚至無法驗證任何C語句正在執行。我知道如果我需要從我的Android文件中的任何C源數據結構,我需要使用API。你明白我的意思嗎? – user3326293
也許我誤解了一些東西,但這對我來說沒有意義。爲什麼你會寫一個函數而不知道它會在什麼情況下被調用?無論如何,你應該在''中使用日誌函數而不是printf。將stdout重定向到logcat也可能起作用,但那不是我嘗試過的。 –
Michael