android jni开发流程

jni开发的流程

第一步:先在java代码中声明一个native的方法

    

/**
 * 第一步
 * @return
 */
public native String fromC();

第二步

在Eclipse的工程目录下创建一个文件夹 名称jni

android jni开发流程_第1张图片


第三步: 编写c代码

#include <stdio.h> //引入标准输入输出的头文件
#include "jni.h" //如果头文件在编译环境里 直接指定<> 如果文件在当前目录下""

//实现java里面未实现的方法

/**
 *JNIEnv* env java虚拟机的环境,指针
 *jobject 调用这个c代码的java对象,如果在MainActivity里面调用的方法。obj代表就是MainActivity对象
 */
<pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 22px;">//Java_com_example_jnidemo1_MainActivity_fromC
Java是固定格式 后面是包名 再后面是方法jstring Java_com_example_jnidemo1_MainActivity_fromC(JNIEnv* env,jobject obj){//第三步 c代码;char* str = "hello from c !!";//在jni规范里面 在jni环境的结构体里面//jstring (*NewStringUTF)(JNIEnv*, const char*);//转化成了java的字符串return (*(*env)).NewStringUTF(env,str);}

 
 

第四步:配置Android.mk文件

    

#指定编译的文件夹  指定当前文件目录
LOCAL_PATH := $(call my-dir)
#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。
include $(CLEAR_VARS)
#编译出来模块的名称
LOCAL_MODULE    := hello

# 编译的源代码的名称
LOCAL_SRC_FILES := hello.c


#编译一个动态库,静态库
#静态库 文件名.a   包含所有的函数并且函数运行的依赖,体积大,包含所有的API
#动态库 文件名.so  包含函数,不包含函数运行的依赖,体积小,运行的时候,去操作系统寻找需要的API
include $(BUILD_SHARED_LIBRARY)

第五步:ndk-build.cmd指令编译c代码

android jni开发流程_第2张图片

第六步:在java代码里面,把动态链接库加载到jvm虚拟机 static{ System.loadLibrary("库文件名称不带前缀,后缀名"); }

	static{
		System.loadLibrary("hello");
	}


第七步: 调用这个方法

button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				String str = fromC();
				Toast.makeText(MainActivity.this, str, 1).show();
			}
		});
	}


这个小项目我已经传到github上面了,有需要的可以下载看看

github:https://github.com/zhouwei5200/JNIDemo



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