android j使用JNI实现ava语言调用C语言

1.在java类中定义native方法相当于在java代码中定义了一个接口 接口的实现方法是C语言实现的

public native String helloWorldFromC();


2.使用javah命令,在class目录下生成头文件

#include <jni.h>
/* Header for class com_example_helloworldformc_MainActivity */

#ifndef _Included_com_example_helloworldformc_MainActivity
#define _Included_com_example_helloworldformc_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_helloworldformc_MainActivity
 * Method:    helloWorldFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_helloworldformc_MainActivity_helloWorldFromC
  (JNIEnv *, jobject);


3.根据头文件,实现C代码

#include <stdio.h>
#include "com_example_helloworldformc_MainActivity.h";  // 引入ndk环境里面的头文件 需要用<> 引用代码中的头文件 ""

//public native String helloWorldFromC(){}
jstring Java_com_example_helloworldformc_MainActivity_helloWorldFromC(JNIEnv* env,jobject obj){
	// 2 步 实现C代码
		// 返回一个java String 类型的字符串
	//jstring     (*NewStringUTF)(JNIEnv*, const char*);
	//(*env) 相当于 JNINativeInterface* JNIEnv
	//*(*env)  相当于 JNINativeInterface
	///return (**env).NewStringUTF(env,"helloworldfromc");

	return  (*env)->NewStringUTF(env,"helloworldfromc");


	// andrond.mk   告诉编译器 如何把c代码打包成函数库
	// 3 生成 .mk文件
	// 4步 把c代码 打包成函数库
}


4.根据实现C代码需要的函数库,生成Android.mk文件

   LOCAL_PATH := $(call my-dir)

   include $(CLEAR_VARS)
	# 对应打包成函数库的名字
   LOCAL_MODULE    := hello
   # 对应c代码的文件
   LOCAL_SRC_FILES := Hello.c

   include $(BUILD_SHARED_LIBRARY)


5.使用NDK编译


6.在java代码中引入函数库,调用native方法

	static{
		System.loadLibrary("hello");// 注意事项 去掉前面的lib 后面的.so
	}

	public void click(View view){
		// 弹出一个土司 土司的内容 是c代码写出来 	
		// 第6步
		Toast.makeText(getApplicationContext(), hello_world_from_c(), 0).show();
		
	}


你可能感兴趣的:(android,jni)