Java反射
1.创建一个java的project
2.实现想通过反射被调用的代码
public class Dialog {
public void show(String message){
System.out.println("diao yong show" + message);
}
}
3.main函数中通过反射调用Dialog的代码
import java.lang.reflect.Method;
public class Demo {
public static void main(String[] args) {
try {
//拿到类的字节码
Class clazz = Demo.class.getClassLoader().loadClass("Dialog");
//拿到方法
Method method = clazz.getDeclaredMethod("show", String.class);
//调用方法
method.invoke(clazz.newInstance(), "this is main");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
C通过反射调用java的代码
1.根目录中创建jni的文件夹,并创建c文件,如果需要在c中使用log需要在代码中增加下面的代码,Android.mk需要增加LOCAL_LDLIBS += -llog来引入log的library
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
完整代码
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
JNIEXPORT void JNICALL Java_com_ldw_ccalljava_MainActivity_helloC
(JNIEnv * env, jobject obj){
//打印log输出
LOGD("hello!");
LOGI("hello!");
//jclass (*FindClass)(JNIEnv*, const char*);包名+类名
jclass clazz = (*env)->FindClass(env, "com/itheima/ccalljava/MainActivity");
//jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
//第一个参数是环境指针,第二个是jclass,第三个是方法名,第四个是方法的签名,在bin/class目录下执行javap -s 类完整的路径,v表示返回值是void
jmethodID methodID = (*env)->GetMethodID(env, clazz, "show", "(Ljava/lang/String;)V");
//void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
//最后一个是传递的参数,需要传递一个将C语言的字符串转换成java的字符串
(*env)->CallVoidMethod(env, obj, methodID, (*env)->NewStringUTF(env, "diao yong java"));
}
GetMethodID中第四个参数获取的方法
2.Android.mk文件,
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS += -llog
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)
3.Android的代码MainActivity.java
package com.ldw.ccalljava;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.view.Menu;
import android.view.View;
public class MainActivity extends Activity {
static{
System.loadLibrary("hello");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
helloC();
}
public native void helloC();
public void show(String message){
Builder builder = new Builder(this);
builder.setTitle("====");
builder.setMessage(message);
builder.show();
}
}