I am able to follow a jni tutorial just fine. But when I change the method name, I run into trouble. Is there a naming convention I need to follow? The tutorial used HelloJNI as the module name, and library name. I used "useaaacom".
I got great feedback on this and i am making progress. I have a related question; let me know if I should create another post for it. I like to build on this app, which runs at this point. How do I call functions from a device driver? I have the header file, and the driver is loaded into my image. By "how" I mean, do I need to have a copy of the header file in my project? This device driver is vendor implemented, i.e. it is not part of AOSP. I do have a copy of it since I downloaded the entire open source project and built it. So what I am asking is what do I need in my apk for the app to call the functions which are part of an active device driver?
Let me know if I should explain any part of it more, or I need to post the header file or ....
I already verified that I can open a device driver with the following lines of code:
#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;
}
I think I need to add the above code to my jni folder in the form of a .c source file, and call the functions in my device driver header file from this file? You may have noticed that the above code is for a test device driver called "hello1". I am gonna change the name to my targeted device driver.
You're free to call your package and class and methods whatever you like at the Java level, subject to the rules of the language, but the naming convention at the C level is completely defined by the output of the
javah
tool.You can call the shared library whatever you like as well subject to filename rules and the rules of ’System.load()/loadLibrary()`.
From Oracle's documentation:
So if you have the following:
Then the corresponding C function should be:
If you have an underscore in the Java method name:
Then the C function would be:
The
_1
escape sequence matches the_
inA_Grill
.