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_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代码
第六步:在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