① android ndk运行问题,大神速进!!!
开发android我觉得还是SDK+eclipse好用,而且搭建平台也简单,易学,建议楼主查查,使用看看~~~
② android ndk r8b和r9c有啥区别
1、增加C++11标准
2、增加opengl es 3.0
3、增加了语音文字转换
4、解决 r8 两次编译的问题
等一系列的功能,当然上面的几个是主要的,
当然现在最新的版本是ndk r10c,
如果要更新的话,建议直接更新到 r10c,
希望对你有用,我是ndk吧吧主,有问题可以ndk吧留言,谢谢!
③ 如何在Vitamio中使用自己编译的FFmpeg
环境要求
Vitamio 3.0是使用Android NDK r8b版本编译生成的,所以建议也使用此版本的NDK编译您改写过的FFmpeg,根据开发者的反馈,使用其它版本的NDK可能导致很多问题甚至崩溃。
编译生成FFmpeg
首先,从我们的GitHub网址:http://github.com/yixia/FFmpeg-Android 下载一份FFmpeg-Android库的拷贝,根据自己的需求对 FFmpeg-Android.sh 进行适当修改。
最常见的场景是编译FFmpeg中你的程序需要的某几个特定模块,其它大部分不需要动。这种情况下,只需要在shell脚本下修改 FFMPEG_FLAGS ,所有可用参数都在FFmpeg的配置脚本里有详细说明,可通过 configure --help 查阅。
个别情况下,如果需要为FFmpeg打补丁,那可能会麻烦些。我假定你自己已经知道了要怎么做。简言之,你只要懂FFmpeg-Android.sh或者编写自己的编译/生成脚本即可。
最后,在bash中运行FFmpeg-Android.sh脚本,既然是bash脚本,也许可能在zsh中运行。
打包libarm.so
在VitamioBundle中找到res/raw/libarm.so这个文件:
=> file res/raw/libarm.so
res/raw/libarm.so: 7-zip archive data, version 0.3
如你所见,它是个7-zip压缩文件,因此可以直接将其解压到随便哪里后,用你自己在前一步生成的libffmpeg.so替换其中原来的每个libffmpeg.so。
60 <=> armv6
61 <=> vfp
70 <=> armv7
71 <=> neon
最后,将替换后的数据照原样重新打包成libarm.so即可。
④ 新手,cocos2dx移植到android平台不知道怎么导入sqlite3库
创建windows平台项目 一、 搭建windows开发环境 官网上显示cocos2d-x支持win7、winxp、vista系统但我只在win7上用过以下说明均是在win7系统上的编译器使用vs2010。 1、 安装vs2010 2、 安装Visual Assist X可选 3、 执行build-win32.bat编译cocos2d-x 4、 运行cocos2d-x根目录下的install-templates-msvc.bat将cocos2d-x模板加入vs模板库。 5、将.\Debug.win32目录下的所有dll文件拷贝至Windows\system32\ (iconv.dll libcocos2d.dll libcocosDenshion.dll libcuri.dll libEGL.dll libgles_cm.dll libxml.dll pthreadVCE2.dll zlib1.dll )6、 双击cocos2d-win32.vc2010.sln进入vs编译环境 二、 新建win32项目 1、在“解决方案”上单击右键选择“添加”-〉“新建项目”。 2、选择“左侧Cocos2d-x模板”在右侧列表中选择“Cocos2d-win32 Application”输入项目名称“Cocos2dDemo”点“确定”。3、在弹出的对话框中点击“下一步”。 4、如果需要使用Box2D引擎则选中否则不要选。点击“finish”创建成功。 三、 编译运行 1、右键Cocos2dDemo项目选择“生成”进行编译。 2、右键Cocos2dDemo项目选择“设为启动项目”。然后F5或者点击菜单栏的运行键 运行。四、 创建新的解决方案 新建项目有两种方式一是直接在cocos2d-x解决方案中添加新项目上面已经介绍过了。当你刚开始接触cocos2d-x还在尝试写demo时用这种方式可以快捷的创建demo而且方便查看例子中的代码。另一种方式是创建一个新的解决方案方法如下 1、“文件”-〉“新建”-〉“项目” 2、进入新建项目的窗口选择“左侧Cocos2d-x模板”在右侧列表中选择“Cocos2d-win32 Application”输入项目名称“Cocos2dDemo”点“确定”。然后执行“下一步”。 3、使用Box2D引擎则选中否则不要选。点击“finish”创建成功。 4、单击左下角的属性标签或者选择“视图”-〉“属性管理器”打开属性管理器5、在属性管理器中双击“Microsoft.Cpp.Win32.user”弹出属性页在里面设置VC++目录即可。这样该设置对所有VC项目都有效见下图。 6、在“包含目录”中, 加入下列项目 (D:\android\cocos2d-2.0-x-2.0.3\cocos2dx\platform\third_party\win32) 7、在“库目录”中, 加入下列项目(D:\adroid\cocos2d-2.0x-2.0.3\Debug.win32)(发布时用release目录下的!!) 8、上面的第4、5、6、7条也可以通过如下方法解决: 定位到%USERPROFILE%\appdata\local\microsoft\msbuild\v4.0可以通过运行或直接在windows资源管理器的地址栏中输入使用其他文本编辑工具修改Microsoft.Cpp.Win32.user.props或Microsoft.Cpp.X64.user.props文件中的相关字段。以下是我的文件内容 <IncludePath>D:\android\cocos2d-2.0-x-2.0.3;D:\android\cocos2d-2.0-x-2.0.3\cocos2dx;D:\android\cocos2d-2.0-x-2.0.3\cocos2dx\include;D:\android\cocos2d-2.0-x-2.0.3\cocos2dx\platform;D:\android\cocos2d-2.0-x-2.0.3\cocos2dx\platform\win32;D:\android\cocos2d-2.0-x-2.0.3\cocos2dx\platform\third_party\win32\OGLES;D:\android\cocos2d-2.0-x-2.0.3\external\Box2D;D:\android\cocos2d-2.0-x-2.0.3\CocosDenshion\include;D:\android\cocos2d-2.0-x-2.0.3\cocos2dx\platform\third_party\win32;D:\android\cocos2d-2.0-x-2.0.3\cocos2dx\kazmath\include;$(IncludePath)</IncludePath><LibraryPath>D:\android\cocos2d-2.0-x-2.0.3\Debug.win32;$(LibraryPath)</LibraryPath> 第4至8条的作用是加入解决方案所依赖的头文件和库文件以保证项目的正常编译运行。 五、 如何删除vs里的cocos2d-x模板 1、 打开如下目录 (Example as default install) 1VS2008: C:\Program Files\Microsoft Visual Studio 9.0\VC\vcprojects\ 2VC2008Express: C:\Program Files\Microsoft Visual Studio 9.0\VC\Express\VCProjects 3VS2010: C:\Program Files\Microsoft Visual Studio 10.0\VC\vcprojects\ 4VC2010Express: C:\Program Files\Microsoft Visual Studio 10.0\VC\Express\VCProjects 2、 删除此目录下的 Cocos2d-x文件夹 3、 删除前缀为 CCAppWiz (0.8.0 or later) 或 CCXAppWiz (0.7.2 or earlier)的文件
将项目由win32移植到android平台 一、 快速搭建android开发环境 1、将服务器上的eclipse、java、android sdk、android ndk、cygwin、cocos2d-x文件夹拷贝到本地请注意保存的路径为英文、不包含空格、且不要过长。 2、 运行eclipse添加android-sdk的路径。(preferences->Android:SDK Location) 3、 添加ADT(Help->Install New Software:Work with) 4、添加java环境变量。 新建变量JAVA_HOME变量值为java目录的绝对路径。 在path中添加 %JAVA_HOME%\D:\android\Java\jdk1.6.0_20\bin; %JAVA_HOME%\D:\android\Java\jdk1.6.0_20\jre\bin; D:\android\Java\jre6\bin; 5、运行一次Cygwin.bat 6、修改\cygwin\home\用户名\.bash_profile文件添加NDK_ROOT=/cygdrive/d/android/android-ndk-r8b export NDK_ROOT 7、 修改\cocos2d-2.0-x-2.0.3\create-android-project.bat中的如下路径 set _CYGBIN=e:\cygwin\bin set _ANDROIDTOOLS=e:\android\android-sdk\tools set _NDKROOT=e:\android\android-ndk-r8 二、 新建android项目 1、 运行create-android-project.bat创建新的android项目例如项目名称为Cocos2dDemo。 2、 将win32下完成的.cpp和.h文件拷贝到\Cocos2dDemo\Classes 3、将win32下使用的资源拷贝到\Cocos2dDemo\proj.android\assets 4、将cpp文件的路径、使用的头文件的目录加入到Android.mk文件。 5、打开Cygwincd 到/Cocos2dDemo/proj.android目录下 6、执行./build_native.sh进行编译 7、在eclipse中编译打包。 三、 补充 1、2.0以上版本的引擎基本无法在android模拟器上运行建议在xcode和vs上调试好直接在真机上运行。 2、2.0以上版本的引擎要求android的开发和运行环境都要2.2以上的sdk。
将项目由win32移植到ios 一、 创建ios项目 1、 安装XCode 2、执行install-templates-msvc.bat将模板添加到XCode 3、打开xcode选择Create a new Xcode project选择cocos2d-x模版 4、点击next填入项目名称Man 5、找到Man的主项目在这里新建一个iOS文件夹。点击create创建完成 6、删除Resource和Classes下的多余文件Helloworld的代码和资源 7、右键点击Resource 选择Add Files to "Man"... 7、将Man主项目文件夹下的Resource文件夹中的资源添加到当前工程。注意选择create folder references for any added folders只是添加一个引用 8、同样的方法添加源文件和头文件到Classes下 9、点击Run编译运行 二、 补充 1、Mac 平台的OS X需要10.6及以上版本 2、IOS平台需要4.0及以上版本 3、IOS真机支持iPad 1、iPad 2、iPad 3、 iPhone 3GS、iPhone 4、iPhone 4S、iPhone 5、iphone6、iPod Touch 3 and iPod Touch 4 不支持iPhone and iPhone 3G。
⑤ 下面截图中的java函数表示的是什么意思,做何种操作
android串口通信以及串口协议解析
一,android串口通信
串口通信采用一个第三方开源项目,实现串口数据收发。
1. 使用了http://code.google.com/p/android-serialport-api/的项目的serialport api和jni;
2. 支持4串口同时收发,有定时自动发送功能,收发模式可选Txt或Hex模式;
3. n,8,1,没得选;
4. 为减轻界面卡顿的情况,接收区的刷新采用单独的线程进行定时刷新;
5. 发送区的数据以及一些设置项,在程序关闭时会自动保存,打开时自动载入;
6. jni使用最新的NDKr8b重新编译了一下
简单编写步骤:
1.新建一个项目,自己起个名字
2.直接复制serialport api和jni文件夹到新建的工程,如果不想自己编译jni,就连libs文件夹也一起复制
3.去android官方网站下载NDK,解压,在CMD中转到jni目录,并执行 绝对路径\ndk-build
4.自己再封装一个工具类或直接使用SerialPort类都行,举个直接使用的例:
直接剽窃原项目的SerialPortActivity.java,并稍微改一下,重点改这里
mSerialPort = mApplication.getSerialPort();
这里可以改成
new SerialPort(new File("/dev/s3c2410_serial0"), 9600, 0);//COM0,波特率9600
5. SerialPortFinder的使用就没什么好讲的了,实例化后用.getAllDevicesPath()就能获取到所有设备了。
其它如数据转换等请参考源码
源码可以参考谷歌android-serialport-api例子
http://code.google.com/p/android-serialport-api/source/checkout
svn checkout http://android-serialport-api.googlecode.com/svn/trunk
二,串口通信协议解析
1.通信基本格式
字段 描述 长度(字节)
起始符 0F,十六进制码 1
信息类型 一个字节,十六进制码(0F,F0,FF等保留码不用)1
信息长度 是信息内容的长度,ASCII码表示(0~9,A~F,最大长度为256)(例如长为11个,十六进制是0B,则两个字节就写0x30 0x42)。
注:因为最大长度256不能满足有些指令的要求,所以对长度做了扩展,下面是扩展说明:
如果第一个字节的最高位为1,则表示扩展长度。在扩展长度状态下,其他15个字节通过16进制大端模式来保存长度。比如:0x80 0x12表示长度为0x001 2,0x81 0x12表示长度为0x0112。2
信息内容 一组十六进制码 N
校验 一个字节,十六进制码,是自信息类型起至对象号止所有码的异或。1
结束符 F0,一个字节,十六进制码 (为了保证可靠性,车机下发的结束符为F0 FF)1
2.协议解析
[java] view plain
/**
* 读取终端设备数据
* @author Administrator
*/
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
// 定义一个包的最大长度
int maxLength = 2048;
byte[] buffer = new byte[maxLength];
// 每次收到实际长度
int available = 0;
// 当前已经收到包的总长度
int currentLength = 0;
// 协议头长度4个字节(开始符1,类型1,长度2)
int headerLength = 4;
while (!isInterrupted()) {
try {
available = mInputStream.available();
if (available > 0) {
// 防止超出数组最大长度导致溢出
if (available > maxLength - currentLength) {
available = maxLength - currentLength;
}
mInputStream.read(buffer, currentLength, available);
currentLength += available;
}
}
catch (Exception e) {
e.printStackTrace();
}
int cursor = 0;
// 如果当前收到包大于头的长度,则解析当前包
while (currentLength >= headerLength) {
// 取到头部第一个字节
if (buffer[cursor] != 0x0F) {
--currentLength;
++cursor;
continue;
}
int contentLenght = parseLen(buffer, cursor, headerLength);
// 如果内容包的长度大于最大内容长度或者小于等于0,则说明这个包有问题,丢弃
if (contentLenght <= 0 || contentLenght > maxLength - 5) {
currentLength = 0;
break;
}
// 如果当前获取到长度小于整个包的长度,则跳出循环等待继续接收数据
int factPackLen = contentLenght + 5;
if (currentLength < contentLenght + 5) {
break;
}
// 一个完整包即产生
// proceOnePacket(buffer,i,factPackLen);
onDataReceived(buffer, cursor, factPackLen);
currentLength -= factPackLen;
cursor += factPackLen;
}
// 残留字节移到缓冲区首
if (currentLength > 0 && cursor > 0) {
System.array(buffer, cursor, buffer, 0, currentLength);
}
}
}
}
/**
* 获取协议内容长度
* @param header
* @return
*/
public int parseLen(byte buffer[], int index, int headerLength) {
// if (buffer.length - index < headerLength) { return 0; }
byte a = buffer[index + 2];
byte b = buffer[index + 3];
int rlt = 0;
if (((a >> 7) & 0x1) == 0x1) {
rlt = (((a & 0x7f) << 8) | b);
}
else {
char[] tmp = new char[2];
tmp[0] = (char) a;
tmp[1] = (char) b;
String s = new String(tmp, 0, 2);
rlt = Integer.parseInt(s, 16);
}
return rlt;
}
protected void onDataReceived(final byte[] buffer, final int index, final int packlen) {
System.out.println("收到信息");
byte[] buf = new byte[packlen];
System.array(buffer, index, buf, 0, packlen);
ProtocolAnalyze.getInstance(myHandler).analyze(buf);
}
⑥ android调用opencv,环境cdt+ndk-r8b+cygwin。
参考答案: 我们大狼哥要是无聊啊,鼻涕泡都能拿来玩会!
⑦ android配置cocos2d-x环境怎么安装CDT
创建Android项目, 项目名称"CCTest". Youngs-MacBook-Air:~ young40$ cd /opt/cocos2d-2.0-x-2.0.3/ Youngs-MacBook-Air:cocos2d-2.0-x-2.0.3 young40$ ./create-android-project.sh use global definition of NDK_ROOT: /opt/android-ndk-r8b use global definition of ANDROID_SDK_ROOT: /opt/android-sdk-macosx Input package path. For example: org.cocos2dx.example com.young40 Now cocos2d-x supports Android 2.2 or upper version Available Android targets: ---------- id: 1 or "android-3" Name: Android 1.5 Type: Platform API level: 3 Revision: 4 Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P ABIs : armeabi ---------- id: 2 or "android-10" Name: Android 2.3.3 Type: Platform API level: 10 Revision: 2 Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854 ABIs : armeabi ---------- id: 3 or "android-15" Name: Android 4.0.3 Type: Platform API level: 15 Revision: 3 Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800 ABIs : armeabi-v7a, x86 ---------- id: 4 or "android-16" Name: Android 4.1 Type: Platform API level: 16 Revision: 2 Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in ABIs : armeabi-v7a input target id: 2 input your project name: CCTest Created project directory: /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/src/com/young40 Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/src/com/young40/CCTest.java Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/res Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/bin Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/libs Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/res/values Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/res/values/strings.xml Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/res/layout Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/res/layout/main.xml Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/AndroidManifest.xml Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/build.xml Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/proguard-project.txt Resolved location of library project to: /opt/cocos2d-2.0-x-2.0.3/cocos2dx/platform/android/java Updated project.properties Updated local.properties Updated file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/proguard-project.txt Youngs-MacBook-Air:cocos2d-2.0-x-2.0.3 young40$ 6.编译默认的C++资源 Youngs-MacBook-Air:proj.android young40$ cd /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/ Youngs-MacBook-Air:proj.android young40$ ./build_native.sh NDK_ROOT = /opt/android-ndk-r8b COCOS2DX_ROOT = /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/../.. APP_ROOT = /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/.. APP_ANDROID_ROOT = /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android Using prebuilt externals make: Entering directory `/opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android' Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver Gdbsetup : libs/armeabi/gdb.setup Compile++ thumb : game_shared <= main.cpp In file included from /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/http://www.cnblogs.com/cocos2dx/platform/android/jni/JniHelper.h:27:0, from jni/hellocpp/main.cpp:2: /opt/android-ndk-r8b/platforms/android-14/arch-arm/usr/include/jni.h:592:13: note: the mangling of 'va_list' has changed in GCC 4.4 Compile++ thumb : game_shared <= AppDelegate.cpp Compile++ thumb : game_shared <= HelloWorldScene.cpp Prebuilt : libgnustl_static.a <= /sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/ Compile++ thumb : cocos2dx_static <= CCConfiguration.cpp .....中间编译输出省略 Prebuilt : curl.a <= /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/http://www.cnblogs.com/cocos2dx/platform/third_party/android/prebuilt/libcurl/libs/armeabi/ StaticLibrary : libextension.a SharedLibrary : libgame.so Install : libgame.so => libs/armeabi/libgame.so make: Leaving directory `/opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android'7. 创建Eclipse项目, 并运行默认Demo 如图, 选择Android Project from Existing Code. 地址选择为:/opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android (直接输入可能会报错, 请用鼠标选择目录) 点击下一步就将项目加入了Eclipse中.但是项目会报错. The import org.cocos2dx.lib cannot be resolved CCTest.java /com.young40.CCTest/src/com/young40 line 26 Java Problem Cocos2dxActivity cannot be resolved to a type CCTest.java /com.young40.CCTest/src/com/young40 line 30 Java Problem Cocos2dxActivity cannot be resolved to a type CCTest.java /com.young40.CCTest/src/com/young40 line 33 Java Problem我的解决办法是将: /opt/cocos2d-2.0-x-2.0.3/cocos2dx/platform/android/java作为一个项目添加进来, 即可解决报错问题. 8.编译运行 我尝试在Android2.3.3虚拟机运行项目失败. 没有关系, 我用真机测试. adb 无线连上真机(cm10真好, 自带无线调试) Youngs-MacBook-Air:proj.android young40$ /opt/android-sdk-macosx/platform-tools/adb connect 192.168.8.139:5555 connected to 192.168.8.139:5555OK, 运行成功, 如图. FPS有点低哈, 我的ipad2, 都能全速60帧. 9.创建名称为CCTest的Xcode项目. 创建后你可以运行测试下. 删除项目下Classes目录 然后将目录/opt/cocos2d-2.0-x-2.0.3/CCTest/Classes添加到项目.请确保Destination是没有被选中的.这样代码将是以引用的方式存在在项目中的. 修改Classes下HelloWorldScene.cpp, 并运行测试. CCLabelTTF* pLabel = CCLabelTTF::create("Hello Cocos2d-x!", "Thonburi", 34);成功.cocos2d-x 2.0.3的版本在ios6上有方向旋转的问题, 应该为横屏才对. 10.在Android中重新运行. 首先运行: /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/build_native.sh 在Eclipse菜单中选择Project=>Clean清理下项目, 然后Run下, 可以在手机看到更改也已经生效. 11. 觉得上一步繁琐? 能不能点击Run同时也编译C++资源呢? 答案是可以的. 选中Eclipse左侧CCTest项目, 右键点击New=>Other, 在弹出对话框中选择C/C++=>Convert to a C/C++Proejct(Adds C/C++ Nature) 在接下来一屏中选择C++ Project以及 Project Type为Makefile project, Toolchains为Other 接下来Eclipse问是否切换到C++视图, 选择否. 如果不小心切换过去了, 再切换回java视图即可. 打开项目属性页面, 设置自动编译C++, 如图: 注意修改Build command为, 另外需要注意项目名称. bash ${workspace_loc:/com.young40.CCTest}/build_native.sh NDK_DEBUG=1 V=1 点击Run,之后我这里报错, 编译提示说"please define NDK_ROOT", 需要在项目设置中添加环境变量.如图 这个时候再点击Run, 会看到Console窗口会有编译的输出, 编译成功. 运行成功. 12.消除Eclipse中的错误提示. 如果打开项目jni目录下hellocpp/main.cpp文件, 会看到大量的报错. 我们需要讲相关文件添加到项目中. 首先添加/opt/cocos2d-2.0-x-2.0.3/CCTest/Classes到项目中.如图添加一个Link类型的文件夹. 用同样方法将"/opt/cocos2d-2.0-x-2.0.3/cocos2dx"添加到项目中. 然后如图添加引用. /opt/android-ndk-r8b/platforms/android-8/arch-arm/usr/include /opt/cocos2d-2.0-x-2.0.3/CocosDenshion/include 这里和子龙山人翻译的老外的文章做法略有不同, 他那个方法还是要报很多错, 可能是版本不同造成的. 我这个方法也不用忽略文件, 用什么类直接鼠标点击可以看到相应声明. 这样初步的IOS&Android开发环境就集成好了.
⑧ MuPDF怎么在windows环境下编译
git submole update --init代码获取完成以后,需要在源代码目录生成一个generated目录,里面有一些.h文件,这一步非常关键,也是我在编译过程中遇到的最大的障碍根据官方网站的说明,需要用 make generate 命令来生成这个目录,这就需要安装cygwin 编译环境.可直接网上下载安装,需要特别注意的是在安装cygwin时必需选择gcc和make相关的部分,否则无法执行 make命令,对新手来说,这一步非常重要,我就是在这里卡了很长时间,make总是不成功,提示说找不到命令,因为以前没有相关经验,所以卡了很长时间。gcc安装也是非常重要,把 gcc 编译c代码和c++ 代码的部分也都选上,否则即使有了make,也不能make成功。
执行make命令(执行make前,需要将cygwin路径加入到环境变量):
make generate
make成功以后,在源代码目录下面会生成generated 文件夹,内容如下图:
这一步成功完成后,编译就成功了一半。下面进行NDK编译,我用的NDK版本是R8B ,需要说明的是,经过我的摸索,并不是所有的版本的NDK都能编译通过,如果使用最新的NDKR8D的话会有非常多的警告。在源代码目录下找到local.properties.sample,改名为local.properties 做如下修改:
sdk.dir=C:\Documents and Settings\Administrator\android-sdks\platforms\android-10
ndk.dir=C:\android-ndk-r8b
分别是android sdk 路径和ndk 路径。这时,先不要执行NDK编译命令 ,在源代码目录的JNI文件夹下找到Application.mk文件,找到下面两行:
# If the ndk is r8b then workaround bug by uncommenting the following line
#NDK_TOOLCHAIN_VERSION=4.4.3
意思是说如果使用ndk r8b编译需要取消注释NDK_TOOLCHAIN_VERSION=4.4.3 这一行,OK,照办,取消注释。这一步非常重要,我就是实现没仔细看这行,导致最后编译不通过。原因是不同版本的GCC,对命令的解释有差异,导致错误,这里就不深究了。下面正式开始NDK编译:
整个编译工作大功告成。
⑨ 使用ndk开发程序需要写什么文件
NDK(Native Development Kit)“原生”也就是二进制
AndroidNDK是一套工具,允许Android应用开发者嵌入从C、C++源代码文件编译来的本地机器代码到各自的应用软件包中,并通过JNI进行访问。Android从1.5开始支持NDK.
android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等
java调用这样实现就需要用JNI(Java Native Interface)
平时用的也就是google给我们封装的好的库,即便是底层实现用的不是Java,但都有统一的Java接口
而NDK的作用是“我们自己写本地代码”(C/C++),自己用JNI封装成Java接口
比如我们想做个计算,二这不是Java的强项,可以用C/C++来写实现,返回一个运算结果就行了
NDKr5已经实现了不用写一行Java代码开发程序了,只不过还是用到了虚拟机,细节被封装隐藏起来了而已
对于JNI和NDK很多Android开发初学者没有搞明白这个问题
JNI是Java调用Native机制,是Java语言自己的特性全称为 Java Native Interface,类似的还有微软.Net Framework上的p/invoke,可以让C#或Visual Basic.Net可以调用C/C++的API,所以说JNI和Android没有关系,在PC上开发Java的应用,如果运行在Windows平台使用 JNI是是经常的,比如说读写Windows的注册表。
NDK是Google公司推出的帮助Android开发者通过C/C++本地语言编写应用的开发包,包含了C/C++的头文件、库文件、说明文档和示例 代码,我们可以理解为Windows Platform SDK一样,是纯C/C++编写的,但是Android并不支持纯C/C++编写的应用,同时NDK提供的库和函数功能很有限,仅仅处理些算法效率敏感的 问题,所以Android123推荐初学者学好Java后再学习JNI。
NDK其实多了一个把.so和.apk打包的工具,这个是很重要的。
而JNI开发并没有打包,只是把.so文件放到文件系统的特定位置。
如果是做应用开发,则需要NDK工具,不然你开发的应用程序怎么给用户用呢?难道帮他重新编译文件系统?
其他至于实现,java调用本地C/C++函数,及其编写方式,我觉得JNI和NDK没有什么区别。
还有一个我个人理解,NDK开发C/C++只能能使用NDK自带的有限的头文件,而使用JNI则可以使用文件系统中带的头文件,比如utils/Log.h
而后者的资源更多,当然NDK正在努力开发中,以便支持更丰富的接口。
2.开发环境搭建:
NDK开发需要安装以下物体:
1.cygwin (需要1.7以上版本,下载地址:http://www.cygwin.com官方明确表示MSys or Cygwin 1.5 is notsupported)
在安装时候,选择make、gcc、g++、bash、
安装好后启动cygwin,运行:
看到如下所11示就ok了 (注意:GNU Make要 3.81以上版本)
3.NDK的使用
(android-ndk-r8b-windows),此文档只针对r8b版进行说明, ndk可以到官方网http://developer.android.com上进行下载
Ndk下载下来随意解压到一个目录即可(ndk的解压后存放的路径必须不能包括空格或中文,比如这种“D:\Program Files\Android-ndk-windows”在cygwin是不能识别成功的。)
如:D:\AndroidDevelop\NDK\android-ndk-r8b
配置NDK 在D:\AndroidDevelop\cygwin\home 目录下找到.bash_profile打开文件加上:
NDK=/cygdrive/d/AndroidDevelop/NDK/android-ndk-r8b
export NDK
配好后重新打开cygwin
输入:
cd $NDK
输入: $NKD/ndk-build 验证NDK是否可以使用?
在Cygwin下用nano或者vim编辑器编辑你的脚本。对于那些已经存在的脚本用dos2unix转化一下。因为Windows下的换行是<LF><CR>,Linux下是<LF>,Mac下是<CR>。
先对你的脚本跑一下 dos2unix .bash_profile 就行了。
配置NDK可以参照 http://www.linuxidc.com/Linux/2012-07/65388.htm
⑩ 怎么给ndk指定gcc版本
给ndk指定gcc版本,在Android.mk里面修改下面内容:
CC=$(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc
CXX=$(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-g++
AS=$(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-as
LD=$(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ld
DEPCC=$(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc
AR=$(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ar
RANLIB=$(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ranlib