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

一、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!\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 文件

编译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

 

觉得不错,就给我点小支持吧,蟹蟹

 

 

 

 

 

posted @ 2019-07-07 13:08  请给我倒杯茶  阅读(487)  评论(0编辑  收藏  举报