环境配置
1、一个概念:java调用C的代码并不是直接调用C的源代码,它是调用由C编译链接生成的二进制文件。
那么生成可执行二进制文件需要用到的工具有哪些:
- cygwin ,在windows平台下模拟成Linux的开发环境。(有插件组成的)
- Linux环境编辑的插件
- NDK(Native Develop Kit) ndk-build 交叉编译
- cdt安装包
2、cygwin安装
- 1、如果插件下载到本地就选第三个,如果没有就选第一个在线安装(可能还需要翻墙)。
-
2、选择安装路径(避免空格和中文)和可以使用的用户
-
3、选择插件的路径(路径要选择到release文件夹的上级目录)
- 4、选择编译插件,点击Devel,后面出现install,点击确定,执行下一步
- 5、打开cygwin根目录下面的.bat文件,进行初始化的操作,输入make -v,如果出现下图,表示编译环境搭建完成。
3、配置ndk 环境边境
- 1、在cygwin的.bat文件中,cd /cygdrive/。。。(。。。处为ndk的具体路径),-->ls 确认显示的文件名是否与ndk-build文件下的目录一样。复制路径(cd /cygdrive/。。。)
- 2、打开cygwin根目录下etc/profile文件,添加路径,在path值的最后面(最后半个引号前面加分号,加刚才复制的路径,保存)
- 3、在cygwin的.bat中,退到根目录,输入ndk-build,出现下图表示配置完成。
4、为eclipse安装c/c++开发插件
- 1、eclipse help-->install new softwore-->add-->cdt路径选择-->next
- 2、到此,开发环境就搭建完成了。
JAVA调用C语言输出HelloWorld
- 1、新建一个android项目NDK_HelloWorld
- 2、编辑布局文件,添加一个button.
- 3、在activity里面添加按钮的点击事件。
- 4、声明一个native方法, public native String helloFromJNI();//本地方法,由c实现
- 5、在项目的根目录下新建一个jni目录(名字是固定的)//关于c的代码放在该文件夹
- 6、在jni文件夹下新建一个Hello.c文件。
//导入相关的类库
include<stdio.h>
include<jni.h>
jstring JAVA_包名_类名_方法名(JNIEnv* env,jobject obj){
//包名,类名中的"."改成成_“”
char * cstr="hello from jni";//c中的字符串
return (**env).NewStringUTF(env,cstr);//返回一个java的字符串
}
- 7、新建一个Android.mk文件,用来告诉交叉编译器如何编译的。
//指定Android.mk文件的路径
LOCAL_PATH := $(call my-dir)
call my-dir 得到当前所处位置的文件夹的绝对目录
初始化参数
include $(CLEAR_VARS)
CLEAR_VARS 清空参数信息
指定 交叉编译后 生成的2进制文件的名称
LOCAL_MODULE := Hello
指定 都有C源代码 参与 交叉编译的操作
LOCAL_SRC_FILES := hello.c xx.c xx1.c xx2.c#asaaaaaa(注释方式#)
指定 交叉编译后 生成的2进制文件的类型
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY 动态链接库
BUILD_STATIC_LIBRARY 静态链接库
动态链接库 和 静态链接库 区别
后缀名 文件大小
动态 .so 小 windows .dll文件 xx.dll Windows\System32 dll之家
静态 .a 大
- 8、交叉编译.c文件
- 1、在.bat文件中 cd /cygdrive/.....(项目下的jni路径)
- 2、输入ndk-build,显示下图,表示生成动态链接库成功。
- 9、在java代码中加载库文件,进行调用。
static{
System.loadLibrary("Hello");
}
public void click(View view){
Toast.makeText(this,helloFromJNI(),o).show();
}
- 9、运行项目,点击按钮,弹出 hello from jni。
用javah生成头文件
上面的步骤中.c文件里面的头文件是自己手动输入的,既麻烦又容易出错。我们可以用javah生成。
- 1、在activity里面声明好native方法以后,打开dos命名行,cd到指定路径(jdk 1.6 到项目的bin/classes jdk 1.7 到项目的src文件夹下)
- 2、输入javah 包名.类名
- 3、刷新项目,到对应路径下查看是否有新生成的.h文件
- 4、将.h文件剪切到jni文件夹下
- 5、导包的时候# include “.h文件名”;(include 不在同一个文件夹下用<>,在同一个文件夹下用“”)
- 6、将.h中的方法复制过来,补充方法体。内容不在赘述(注意参数补充完整)