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里方法是能够被重载的,好比我一个类里有public>"(II)I"表示的就是这个函数参数为2个int,返回值为int
其实除了本身对照手写以外,JDK也提供了一个很好用的生成签名的工具javap,cmd进入控制台到你要生成签名的那个类的class文件目录下。如我这里是MainActivity获得结果以下:java
其实很简单就是多调用一个构造函数构造出一个实例来再去调用非静态函数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; }