238.JNI简单使用eclipse--java反射和c反射调用java代码

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();
    }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值