ndk c调用java函数

静态函数调用代码

 1 package com.example.as;
 2 
 3 import android.os.Bundle;
 4 import android.app.Activity;
 5 import android.content.res.Resources.Theme;
 6 import android.view.Menu;
 7 import android.widget.TextView;
 8 
 9 public class MainActivity extends Activity {
10 
11     @Override 
12     public void onCreate(Bundle savedInstanceState) 
13       { 
14         try {
15             Thread.sleep(5000);
16         } catch (InterruptedException e) {
17             // TODO Auto-generated catch block
18             e.printStackTrace();
19         }
20         super.onCreate(savedInstanceState); 
21         TextView  tv = new TextView(this); 
22         stringFromJNI();
23 //        tv.setText(  ); 
24         setContentView(tv); 
25       } 
26     public native String  stringFromJNI(); 
27     public native String  unimplementedStringFromJNI(); 
28     public static int add(int x, int y) { 
29         System.out.println("==Java静态add方法=="); 
30         return x + y; 
31         } 
32     static { 
33             System.loadLibrary("AS"); 
34     }
35 
36 }
#include <jni.h>
#include <string.h>
#include <stdio.h>

int Java_com_example_as_MainActivity_stringFromJNI(JNIEnv* env,
        jobject thiz) {

    // 获取类
    jclass AnalyzeCidUtil = (*env)->FindClass(env,"com/example/as/MainActivity");
    if (NULL == AnalyzeCidUtil) {
        return -1;
    }

    // 获取类add静态方法
    jmethodID add = (*env)->GetStaticMethodID(env,AnalyzeCidUtil, "add", "(II)I");
    if (NULL == add) {
        (*env)->DeleteLocalRef(env,AnalyzeCidUtil); // 删除类指引
        return -2;
    }

    // 调用静态int方法
    int result = (*env)->CallStaticIntMethod(env,AnalyzeCidUtil, add, 3, 5);

    return 0;
}

代码解释

java中定义了一个静态函数publicstaticintadd(intx,inty) ,在C中经过FindClass找到类,GetStaticMethodID找到方法,经过CallStaticIntMethod调用方法
GetStaticMethodID的第4个参数是什么意思呢? "(II)I"
这个是方法签名

方法签名

 

在这里有必要单独来说一讲这个方法签名,为何要用这个东东呢?咱们知道,在Java里方法是能够被重载的,好比我一个类里有public>"(II)I"表示的就是这个函数参数为2个int,返回值为int
其实除了本身对照手写以外,JDK也提供了一个很好用的生成签名的工具javap,cmd进入控制台到你要生成签名的那个类的class文件目录下。如我这里是MainActivity获得结果以下:java

 
E:\Users\fish\workspace\AS\bin\classes\com\example\as>javap -s MainActivity
Compiled from "MainActivity.java"
public class com.example.as.MainActivity extends android.app.Activity{
static {};
  Signature: ()V
public com.example.as.MainActivity();
  Signature: ()V
public void onCreate(android.os.Bundle);
  Signature: (Landroid/os/Bundle;)V
public native java.lang.String stringFromJNI(java.lang.String);
  Signature: (Ljava/lang/String;)Ljava/lang/String;
public native java.lang.String unimplementedStringFromJNI();
  Signature: ()Ljava/lang/String;
public static int add(int, int);
  Signature: (II)I
}
这就是函数和签名的对照表

非静态函数调用代码

其实很简单就是多调用一个构造函数构造出一个实例来再去调用非静态函数android

 1 package com.example.as;
 2 
 3 import android.os.Bundle;
 4 import android.app.Activity;
 5 import android.content.res.Resources.Theme;
 6 import android.view.Menu;
 7 import android.widget.TextView;
 8 
 9 public class MainActivity extends Activity {
10 
11     @Override 
12     public void onCreate(Bundle savedInstanceState) 
13       { 
14         try {
15             Thread.sleep(5000);
16         } catch (InterruptedException e) {
17             // TODO Auto-generated catch block
18             e.printStackTrace();
19         }
20         super.onCreate(savedInstanceState); 
21         TextView  tv = new TextView(this); 
22         stringFromJNI();
23 //        tv.setText(  ); 
24         setContentView(tv); 
25       } 
26     public native String  stringFromJNI(); 
27     public native String  unimplementedStringFromJNI(); 
28     public static int add(int x, int y) { 
29         System.out.println("==Java静态add方法=="); 
30         return x + y; 
31         } 
32     static { 
33             System.loadLibrary("AS"); 
34     }
35     
36     /** C回调Java方法(非静态) */ 
37     public int sub(int x, int y) { 
38     System.out.println("==Java非静态sub方法=="); 
39     return x - y; 
40     } 
41 
42 }
#include <jni.h>
#include <string.h>
#include <stdio.h>
/**
 * 实例化类对象
 */
jobject getInstance(JNIEnv *env, jclass clazz) {
    // 获取构造方法
    jmethodID constructor = (*env)->GetMethodID(env,clazz, "<init>", "()V");
    if (NULL == constructor) {
        return NULL;
    }
    // 实例化类对象
    return (*env)->NewObject(env,clazz, constructor);
}
int Java_com_example_as_MainActivity_stringFromJNI(JNIEnv* env,
        jobject thiz) {

        // 获取类
        jclass  AnalyzeCidUtil = (*env)->FindClass(env,"com/example/as/MainActivity");
        if (NULL == AnalyzeCidUtil) {
            return -1;
        }

        // 实例化类对象
        jobject mAnalyzeCidUtil = getInstance(env, AnalyzeCidUtil);
        if (NULL == mAnalyzeCidUtil) {
            (*env)->DeleteLocalRef(env,AnalyzeCidUtil); // 删除类指引
            return -2;
        }

        // 获取对象sub方法
        jmethodID sub = (*env)->GetMethodID(env,AnalyzeCidUtil, "sub", "(II)I");
        if (NULL == sub) {
            (*env)->DeleteLocalRef(env,AnalyzeCidUtil); // 删除类指引
            (*env)->DeleteLocalRef(env,mAnalyzeCidUtil); // 删除类对象指引
            return -3;
        }

        // 调用非静态int方法
        int result = (*env)->CallIntMethod(env,mAnalyzeCidUtil, sub, 6, 76);
        

    return 0;
}
相关文章
相关标签/搜索