韋東山視頻第3課第1節_JNI_P【學習筆記】

1、android系統java調用C方法的大概的流程圖以下:java

2、下面寫一個JNI的程序,java的hello方法在加載native庫以後可以調用C方法.android

2.1 JNIDemo.java 文件內容以下git

 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 文件內容以下github

 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 }

編譯過程jvm

編譯JNIDemo.java 文件spa

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

執行須要將本地的動態庫添加到環境變量export LD_LIBRARY_PATH=.:blog

 3、JNI的字段描述符get

以下代碼的第二項就是JNI的字段描述符,這個描述符描述的是hello的參數還有返回值,it

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

自動生成字段描述符,命令javah -jni JNIDemo ,以後查看生成的JNIDemo.h文件

 

 相關的參考代碼能夠在這裏下載

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

相關文章
相關標籤/搜索