一、android系统java调用C方法的大概的流程图如下:

韦东山视频第3课第1节_JNI_P【学习笔记】_ide

二、下面写一个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!\r\n");
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 文件

韦东山视频第3课第1节_JNI_P【学习笔记】_描述符_02

编译native.c 文件(gcc -I/usr/lib/jvm/java-7-openjdk-amd64/include  -fPIC -shared -o libnative.so native.c):

韦东山视频第3课第1节_JNI_P【学习笔记】_描述符_03

执行需要将本地的动态库添加到环境变量export LD_LIBRARY_PATH=.:

韦东山视频第3课第1节_JNI_P【学习笔记】_描述符_04

 三、JNI的字段描述符

如下代码的第二项就是JNI的字段描述符,这个描述符描述的是hello的参数还有返回值,

1 static const JNINativeMethod methods[]={
2 {"hello","()V",c_hello}
3

韦东山视频第3课第1节_JNI_P【学习笔记】_ide_05

韦东山视频第3课第1节_JNI_P【学习笔记】_ide_06

自动生成字段描述符,命令javah -jni JNIDemo ,之后查看生成的JNIDemo.h文件

韦东山视频第3课第1节_JNI_P【学习笔记】_java_07

韦东山视频第3课第1节_JNI_P【学习笔记】_描述符_08

 

 相关的参考代码可以在这里下载

 ​​https://github.com/zzb2760715357/100ask/tree/master/java​

韦东山视频第3课第1节_JNI_P【学习笔记】_描述符_09