jni开发的流程:
第一步:先在java代码中声明一个native的方法
/** * 第一步 * @return */ public native String fromC();
第二步:
在Eclipse的工程目录下创建一个文件夹 名称jni
第三步: 编写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_fromCJava是固定格式 后面是包名 再后面是方法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代码
第六步:在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:https://github.com/zhouwei5200/JNIDemo