今天终于将第一个 NDK 程序编译、运行成功。
起先看资料和书籍时,都要求安装 CygWin。我也安装了,并将 Sample: hello-jni 编译成功。编译的 LOG 如下: 
LeoZheng@LeoZheng-PC /cygdrive/d/Android-Linux/android-ndk-r10c/samples/hello-jni
$ ../../ndk-build
[arm64-v8a] Gdbserver      : [aarch64-linux-android-4.9] libs/arm64-v8a/gdbserver
[arm64-v8a] Gdbsetup       : libs/arm64-v8a/gdb.setup
[x86_64] Gdbserver      : [x86_64-4.9] libs/x86_64/gdbserver
[x86_64] Gdbsetup       : libs/x86_64/gdb.setup
[mips64] Gdbserver      : [mips64el-linux-android-4.9] libs/mips64/gdbserver
[mips64] Gdbsetup       : libs/mips64/gdb.setup
[armeabi-v7a] Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi-v7a/gdbserver
[armeabi-v7a] Gdbsetup       : libs/armeabi-v7a/gdb.setup
[armeabi] Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
[armeabi] Gdbsetup       : libs/armeabi/gdb.setup
[x86] Gdbserver      : [x86-4.6] libs/x86/gdbserver
[x86] Gdbsetup       : libs/x86/gdb.setup
[mips] Gdbserver      : [mipsel-linux-android-4.6] libs/mips/gdbserver
[mips] Gdbsetup       : libs/mips/gdb.setup
[arm64-v8a x86_64 mips64 armeabi-v7a armeabi x86 mips] Cygwin         : Generating dependency file converter script
[arm64-v8a] Compile        : hello-jni <= hello-jni.c
[arm64-v8a] SharedLibrary  : libhello-jni.so
[arm64-v8a] Install        : libhello-jni.so => libs/arm64-v8a/libhello-jni.so
[x86_64] Compile        : hello-jni <= hello-jni.c
[x86_64] SharedLibrary  : libhello-jni.so
[x86_64] Install        : libhello-jni.so => libs/x86_64/libhello-jni.so
[mips64] Compile        : hello-jni <= hello-jni.c
[mips64] SharedLibrary  : libhello-jni.so
[mips64] Install        : libhello-jni.so => libs/mips64/libhello-jni.so
[armeabi-v7a] Compile thumb  : hello-jni <= hello-jni.c
[armeabi-v7a] SharedLibrary  : libhello-jni.so
[armeabi-v7a] Install        : libhello-jni.so => libs/armeabi-v7a/libhello-jni.so
[armeabi] Compile thumb  : hello-jni <= hello-jni.c
[armeabi] SharedLibrary  : libhello-jni.so
[armeabi] Install        : libhello-jni.so => libs/armeabi/libhello-jni.so
[x86] Compile        : hello-jni <= hello-jni.c
[x86] SharedLibrary  : libhello-jni.so
[x86] Install        : libhello-jni.so => libs/x86/libhello-jni.so
[mips] Compile        : hello-jni <= hello-jni.c
[mips] SharedLibrary  : libhello-jni.so
[mips] Install        : libhello-jni.so => libs/mips/libhello-jni.so

到实际编写自己的 NDK 程序时,才发现了如下一段话:
谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK。
而在NDKr7开始,Google的Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了。只需要为Eclipse Android工程添加一个Builders,而为Eclipse配置的builder,其实就是在执行Cygwin,然后传递ndk-build作为参数,这样就能让Eclipse自动编译NDK了。
具体的Eclipse配置 builder 的方法,就不说了,网上有现成的。如: http://www.cnblogs.com/yejiurui/p/3476565.html

D:\Android-Linux\workspace\NDKEumClick>
D:\Android-Linux\workspace\NDKEumClick\bin\classes>javah com.hs.leozheng.ndkeumclick.jniClick
生成的 .h 文件位于目录: workspace\NDKEumClick\bin\classes
com_hs_leozheng_ndkeumclick_jniClick.h

新建文件 com_hs_leozheng_ndkeumclick_jniClick.c,并输入代码。
Android.mk 的内容如下: 
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jniClick
LOCAL_SRC_FILES := com_hs_leozheng_ndkeumclick_jniClick.c
include $(BUILD_SHARED_LIBRARY)

完成后在 Android 中可以看到如下 Log:
Android NDK: WARNING: APP_PLATFORM android-21 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
Android NDK: WARNING: Unsupported source file extensions in jni/Android.mk for module jniClick
Android NDK:   com_hs_leozheng_ndkeumclick_jniClick.h
[armeabi] Install        : libjniClick.so => libs/armeabi/libjniClick.so
 
调用 .so 的 Android 工程代码如下:
public class MainActivity extends ActionBarActivity {
static {
        System.loadLibrary("jniClick");
    }

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

String str = jniClick.AddStr("test", "test");
Log.i("NDK", "jni addStr function: "  + str);

int ret = jniClick.AddInt(10, 6);
Log.i("NDK", "jni addInt function: " + Integer.toString(ret));
}

......
}
 
 FATAL EXCEPTION: main
 java.lang.UnsatisfiedLinkError: AddStr
  at com.hs.leozheng.ndkeumclick.jniClick.AddStr(Native Method)
  at com.hs.leozheng.ndkeumclick.MainActivity.onCreate(MainActivity.java:19)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:123)
  at android.app.ActivityThread.main(ActivityThread.java:3683)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:507)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
  at dalvik.system.NativeStart.main(Native Method)

错误产生的原因:
在 Android.mk 错误的将 LOCAL_SRC_FILES 设置为头文件: com_hs_leozheng_ndkeumclick_jniClick.h
正确的应该是: 
LOCAL_SRC_FILES := com_hs_leozheng_ndkeumclick_jniClick.c

转载于:https://www.cnblogs.com/91program/p/5193296.html

今天终于将第一个 Android NDK 程序编译、运行成功相关推荐

  1. 终于发布一个android应用程序到机锋市场,AppChina应用汇了

    终于发布一个android应用程序到机锋市场,AppChina应用汇了. 机锋市场和智件园注册上传都比较麻烦, AppChina应用汇开始最简单但后面的验证还是比较麻烦的而且不能包含广告和积分的,cm ...

  2. Eclipse+CDT+GDB调试android NDK程序

    http://www.cnblogs.com/shadox/archive/2011/12/02/2272564.html Eclipse+CDT+GDB调试android NDK程序 Eclipse ...

  3. android如何写第一个程序,第一个Android应用程序

    **文章摘要 ** 1.熟悉第一个Android应用程序的创建,以及创建过程中的各个文件夹的意义. 2.熟悉Android界面之间的跳转方式. 一.关于开发工具: 1.开发工具(Eclipse.And ...

  4. 使用Android Killer反编译apk成功,回编译打包失败问题记录

    问题:直接使用Android Killer对apk进行反编译,反编译成功,未做任何修改,直接点击"编译",编译报错,提示相关代码未找到,无法进行下一步apk签名操作. 排查: 检查 ...

  5. 从零开始写第一个Android应用程序

    学习Android准备知识 安卓四层系统构成: 第一层:最底层 Linux层 第二层:函数库层 由C或者C++写 第三层:Application FrameWork 应用框架层 第四层:最上层 应用层 ...

  6. 第一个Android应用程序 (二)

    目录 一.大体流程 二.创建项目 1)创建一个新项目 2)选择模板并定义项目名称 三.探索项目 探索项目窗格 Ⅰ.app ( Application ) Ⅱ.res ( Resource ) Ⅲ.Gr ...

  7. 如何运行编好的Android程序,3. 编写的第一个android HelloWorld程序如何在手机上面调试运行...

    以前有用自己的手机开发过Android的小程序玩玩,现在又想学习下 opencv + android的开发,按照网上的教程配置了两天的环境了, 发现编写的HelloWorld程序在 avd4.2的设备 ...

  8. 我的第一个Android应用程序

    文章目录 前言 一.软件的下载 二.创建一个新项目 三.应用的运行 1.程序的设计 2.在模拟器上运行 3.在真实机上运行 前言 本文章将向你描述如何创建自己的第一个安卓应用程序,你将学会如何创建一个 ...

  9. Win10 上使用 MSYS 开发 Android NDK 程序

    目标在 Win10 上用 MSYS 命令行为 Android 编译 C/C++ 程序库.参考下面的文章(太旧了): https://www.jianshu.com/p/40fa9c8df0bc htt ...

最新文章

  1. Java中实现六种图像处理的效果(灰度化、马赛克效果、去背景实现、珠纹化实现、黑白版画效果、油画效果)
  2. 011_logback中的SMTPAppender
  3. LOWORD或HIWORD宏得到的是一个无符号WORD类型的数
  4. 如何在PowerPoint中自动调整图片大小
  5. [C++11]字符串原始字面量
  6. JQuery validate 各项验证规则讲解
  7. C语言——选择法排序_数组
  8. GroovyHelp方便查看java api
  9. html开始游戏如何打开,dnf游戏进不去 点击开始-运行,输入CMD
  10. [竞品分析] 猿辅导-K12在线教育产品
  11. 服务器藏宝系列,区如其名,这个服务器里果然遍地都是宝藏
  12. 分布式异步任务神器-Celery
  13. 研华运动控制卡接线图_运动控制卡说明书
  14. _.chunk的用法
  15. 如何优化WebService进行大批量数据传送(WSE3.0应用技巧)
  16. TCP 四次挥手的过程
  17. 【黑马程序员】C++核心编程2 -类与对象(封装、继承和多态)-this指针-友元-运算重载符-文本操作(附测试用例源码、测试结果图及详细注释)
  18. HC小区管理系统宝塔方式安装
  19. VFX Graph 魔法图书馆
  20. 软件逆向—— ExifPro 2.1

热门文章

  1. char转成string_真没想到,一个小小的String居然还有这么多窍门?
  2. 大数据架构详解_【数据如何驱动增长】(3)大数据背景下的数仓建设 amp; 数据分层架构设计...
  3. windows11推出:win10可免费升级,支持安卓APP,减重40%
  4. 2021 阿里云容器服务年度盘点:企业级容器应用变化和技术趋势观察
  5. 从消息到数据湖:看 Apache RocketMQ、Hudi、Kyuubi 最新进展
  6. OpenYurt 开箱测评 | 一键让原生 K8s 集群具备边缘计算能力
  7. redis取出list最边的一个_这几个Redis使用技巧,让你的程序快如闪电
  8. 非递归快速排序php,快排序的非递归实现(原创)
  9. linux 7za下载,Linux安装7za
  10. 一级计算机综合训练第五卷,2018职称计算机考试基础综合练习及答案(5)