The steps to invoke the C function through JNI in Java code are as follows:
First step: Writing Java code
1 classhellojni{2 native voidPrinthello ();3 native voidprintstring (String str);4 5 Static{system.loadlibrary ("Hellojni");}6 7 Public Static voidMain (String args[]) {8Hellojni Myjni =NewHellojni ();9 Ten Myjni.printhello (); OneMyjni.printstring ("Hello World from C Fun"); A - } - the}
Step two: Compiling Java code
Javac Hellojni.java generating Hellojni.class files
Step three: Generate the C language header file
Javah Hellojni generating HelloJNI.h header files
/*Do not EDIT this file-it are machine generated*/#include<jni.h>/*Header for Class Hellojni*/#ifndef _included_hellojni#define _included_hellojni#ifdef __cplusplusexternC{#endif/** Class:hellojni * Method:printhello * Signature: () V*/Jniexportvoidjnicall Java_hellojni_printhello (jnienv*, jobject);/** Class:hellojni * method:printstring * Signature: (ljava/lang/string;) V*/Jniexportvoidjnicall java_hellojni_printstring (jnienv*, Jobject, jstring); #ifdef __cplusplus} #endif #endif
Fourth step: Writing C code
Note that the C code must be written in the same way as the previous header file, which differs from the normal C function.
1#include"HelloJNI.h"2#include <stdio.h>3 4JniexportvoidJnicall Java_hellojni_printhello (JNIENV *env, Jobject obj) {5printf"Hello world!\n");6 return;7 }8 9JniexportvoidJnicall java_hellojni_printstring (jnienv * env, jobject obj, jstringstring) {Ten Const Char*str = (*env)->getstringutfchars (env,string,0); Oneprintf"%s!\n", str); A return; -}
Fifth step: Generate C Shared Library
Codeblocks under:
File-new-project-shared library-go
Because there is such a line in HelloJNI.h <jni.h>, the standard library file does not have this file, but this file can be found under the JDK installation directory
In order to be able to compile successfully, it is necessary to copy the corresponding files to the C compiler's header file repository, as follows:
Compile build C shared library file:
However, codeblocks default generated files prefixed with LIB, need to be removed manually, but the operation is still a problem:
1D:\hixin\c>Java hellojni2ExceptioninchThread"Main"JAVA.LANG.UNSATISFIEDLINKERROR:D:\HIXIN\C\HELLOJNI.D3Ll:can't load IA 32-bit. dll on a AMD 64-bit platform4 At java.lang.classloader$nativelibrary.load (Native Method)5 At java.lang.ClassLoader.loadLibrary0 (Unknown Source)6 At java.lang.ClassLoader.loadLibrary (Unknown Source)7 At java.lang.Runtime.loadLibrary0 (Unknown Source)8 At java.lang.System.loadLibrary (Unknown Source)9At Hellojni.<clinit> (Hellojni.java:5)
The main idea is that the generated DLL is not 64-bit, see the latest version of the online vs seems to be able to generate 64-bit DLLs, it is not tangled this
The first of Android advanced calls C library functions in Java