一、android系统java调用C方法的大概的流程图如下:
二、下面写一个JNI的程序,java的hello方法在加载native库之后能够调用C方法.
2.1 JNIDemo.java 文件内容如下
1 public class JNIDemo{ 2 3 static { 4 System.loadLibrary("native"); 5 } 6 7 public native void hello(); 8 9 public static void main(String args[]){ 10 JNIDemo d = new JNIDemo(); 11 d.hello(); 12 } 13 }
2.2 native.c 文件内容如下
1 #include <jni.h> 2 #include <stdio.h> 3 4 void c_hello(JNIEnv *env, jobject cls) 5 { 6 printf("Hello World! "); 7 } 8 9 10 static const JNINativeMethod methods[]={ 11 {"hello","()V",c_hello} 12 }; 13 14 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) 15 { 16 JNIEnv *env; 17 jclass cls; 18 if ((*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_4)) { 19 return JNI_ERR; 20 } 21 cls = (*env)->FindClass(env, "JNIDemo"); 22 if (cls == NULL) { 23 return JNI_ERR; 24 } 25 26 if ((*env)->RegisterNatives(env,cls,methods,sizeof(methods)/sizeof(methods[0]))<0) 27 return JNI_ERR; 28 29 return JNI_VERSION_1_4; 30 }
编译过程
编译JNIDemo.java 文件
编译native.c 文件(gcc -I/usr/lib/jvm/java-7-openjdk-amd64/include -fPIC -shared -o libnative.so native.c):
执行需要将本地的动态库添加到环境变量export LD_LIBRARY_PATH=.:
三、JNI的字段描述符
如下代码的第二项就是JNI的字段描述符,这个描述符描述的是hello的参数还有返回值,
1 static const JNINativeMethod methods[]={ 2 {"hello","()V",c_hello} 3 };
自动生成字段描述符,命令javah -jni JNIDemo ,之后查看生成的JNIDemo.h文件
相关的参考代码可以在这里下载
https://github.com/zzb2760715357/100ask/tree/master/java