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

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这些都是 Android NDK 内部的 `Android.mk` 文件。其中,`./android-ndk-r25c/sources/android/native_app_glue/Android.mk` 是用于编译 Native Activity 示例应用程序的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/support/Android.mk` 是包含一些 Android 支持库的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/ndk_helper/Android.mk` 是包含一些辅助函数和类的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/cpufeatures/Android.mk` 是用于编译 `cpufeatures` 库的 `Android.mk` 文件,该库提供了一些 CPU 相关的信息和功能;`./android-ndk-r25c/sources/cxx-stl/llvm-libc++abi/Android.mk` 和 `./android-ndk-r25c/sources/cxx-stl/llvm-libc++/Android.mk` 是用于编译 C++ STL 库的 `Android.mk` 文件,分别对应 libc++abi 和 libc++ 两个 STL 库;`./android-ndk-r25c/sources/third_party/googletest/Android.mk` 是用于编译 Google Test 测试框架的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/Android.mk` 是用于编译 Shaderc 编译器的 `Android.mk` 文件,该编译器可以将 GLSL 代码编译成 SPIR-V 代码;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc/Android.mk` 是用于编译 Shaderc 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc_util/Android.mk` 是用于编译 Shaderc Util 库的 `Android.mk` 文件,该库提供了一些辅助函数和类;`./android-ndk-r25c/sources/third_party/shaderc/third_party/Android.mk` 是用于编译 Shaderc 编译器依赖的第三方库的 `Android.mk` 文件,包括 glslang 和 spirv-tools 两个库;`./android-ndk-r25c/sources/third_party/shaderc/third_party/glslang/Android.mk` 是用于编译 glslang 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/third_party/spirv-tools/Android.mk` 是用于编译 spirv-tools 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/vulkan/src/build-android/jni/Android.mk` 是用于编译 Vulkan 库的 `Android.mk` 文件。 如果您要在 Android NDK 中编写自己的 `Android.mk` 文件,可以参考这些示例文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值