Android NDK:②第一个NDK程序(创建步骤&一些问题)

Android NDK:②第一个NDK程序(创建步骤&一些问题)

本节内容是:演示搭建第一个NDK程序

  • Android NDK第一个NDK程序创建步骤一些问题

    • 创建一个Android Project
    • Java代码中声明native方法
    • 创建Jni文件夹编写ccpp代码
    • 为项目添加NDK支持
    • 新建配置一个Builder
    • 调用了native方法的地方加载库
    • 好了把程序跑起来
    • 总结
    • 遇到的问题

1.创建一个Android Project

直接创建一个新的Android Application Project即可~

2.Java代码中声明native方法:

package com.jay.example.firstndk;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    private Button btnShow;

    // 声明native方法
    public native String javaFromJNI();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnShow = (Button) findViewById(R.id.btnShow);
        btnShow.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, javaFromJNI(),
                        Toast.LENGTH_SHORT).show();
            }
        });
    }
}

3.创建Jni文件夹,编写c/cpp代码

这里要注意的地方有两个:

①返回值类型

jni.h文件中中事先定义的数据类型,我们可以在ndk/platforms/android-xx/arch-arm/user/include目录下找到,~xx代表版本号

打开jni.h我们会看到很多数据类型,我们这里的是string:

②方法名:按照下述规则:

返回值类型 Java_包名_类名_native方法名(JNIEnv* env, jobject obj)

而里头的参数是固定的,在jni.h文件我们也可以查到,他是一个叫做JNINativeInterface的结构体,结构体中定义了很多数据类型,我们找到那个返回字符串的:

好的,那么接下来我们把我们的c代码写完,我们在jni目录下创建一个叫first.c的文件:

#include<stdio.h>
#include<jni.h>  

jstring Java_com_jay_example_firstndk_MainActivity_javaFromJNI(JNIEnv* env, jobject obj) {
    return (*env)->NewStringUTF(env, "First Blood~");
}

4.为项目添加NDK支持

工程右键->Android Tools ->Add Native Support输入so库名称:

自己给so库命名:

这个时候会看到,jni目录下除了我们自己编写的c文件外,还多了两个东东,xx.cpp和Android.mk文件,那个cpp可以直接删掉,接着打开Android.mk件,修改下东西:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := FirstNDK
LOCAL_SRC_FILES := first.c

include $(BUILD_SHARED_LIBRARY)

ps:其实这步可以直接在3就进行,会直接生成一个.cpp与Android.mk的文件的~

5.新建&配置一个Builder

右键Project->Properties->Builders->New,新建一个Builder,在弹出的对话框上面点击Program,OK!如图所示

双击打开,进行配置:

点击确定,OK,好了,接下来就可以自定编译代码了~比如我们修改代码后保存,他都会重新编译下.so

6.调用了native方法的地方加载库:

7.好了,把程序跑起来~

8.总结:

好了,第一个NDK程序就这样完成了,中途磕磕碰碰遇到很多问题,总算是顺利地跑起来了,下面归纳下大概步骤:

  • 创建一个普通NDK工程
  • 声明native方法
  • 创建Jni文件夹,可以自己写个.c或者.cpp文件,或者直接第四步直接生成一个.cpp与Android.mk文件
  • 为项目添加NDK支持
  • 新建&配置一个Builder
  • 调用了native方法的地方加载库(System.loadLibrary(xxx))
  • 运行程序~~

好了,大概过程就如上面所述~可能还有其他快捷的创建方法吧,后续遇到的话在给大家介绍哈~最后附上弄这个程序时遇到的一些问题以及解决方法!

9.遇到的问题

1.运行后程序直接死掉- -,后来查log发现是c那里方法名写错了,直接报方法找不到!

解决方法:严格按照下述规定写

返回值类型 Java_包名_类名_native方法名(JNIEnv* env, jobject obj)

2.出现这样的提示:

Android NDK: WARNING: APP_PLATFORM android-17 is larger than android:minSdkVersion 14 in ./AndroidManifest.xml

解决方法:

android-ndk-r8e/build/core/add-application.mk第128行把__ndk_warning改为__ndk_info;然后重新build一次项目即可消除错误。

或者,直接写成这样…我们公司是这样做的…感觉这样虽然不报错,但是不好…

3.用c来写的出现:Method ‘NewStringUTF’ could not be resolved

就是找不到方法,真奇葩…

解决方法:

比如我的路径是:

E:\NDK\android-ndk-r10d\platforms\android-17\arch-arm\usr\include

4.如果你用的是.cpp的话,出现3的问题

解决方法:为供Java调用的c++函数前加入extern “C” 修饰

另外输出字符串的语句也是不一样的:

(*env)->Method(env, XXX)改成env->Method(XXX)即可.

时间: 2024-10-12 23:31:29

Android NDK:②第一个NDK程序(创建步骤&一些问题)的相关文章

Android Studio新建一个HelloWorld 程序(App)

Android Studio新建一个HelloWorld程序(App) 新建 或者直接启动程序(注:如果已有程序,此方法会直接打开最近一次关闭从程序) 更改App名 选择App运行平台 选择模板 更改主视图名 等待程序编译 此过程需要较长时间,耐心等待- 直到底部状态栏不再有动作执行. AS默认打开主视图代码 打开设计界面 运行程序 首先手机开启调试模式,并连接电脑 注1:此过程有可能会因为某些原因App不能正常运行 注2:此过程需要较长时间,耐心等待,直到手机上App启动成功 程序运行完成 G

02-第一个iOS程序-开发步骤

打开Xcode 选择项目模板 Single View Application是最适合初学者的模板 设置项目属性 运行程序 不管怎样,先运行第一个iOS程序看看效果先(用快捷键Command + R 也行) 运行结果 Xcode会启动一个iOS模拟器来运行程序 程序的运行结果如右图所示,白白一片 后面我们得往这空白界面上增添各种各样的控件元素 窥探项目环境 项目创建完毕后,自动帮我们做了很多配置,也自动生成了很多文件 还自动添加了开发所依赖的框架: 如何搭建UI界面 项目中这么多文件,哪些是影响着

android中一个应用程序创建多个图标

说明:最关键的只有一点,在全局配置文件中对于你要创建图标的activity进行如下配置即可: <intent-filter>             <action android:name="android.intent.action.MAIN" />             <category android:name="android.intent.category.LAUNCHER" />         </int

用android去写一个小程序

前言: 软工的一个小作业:实现"黄金分割小游戏", 需要结对编程,队友:陈乐云(http://www.cnblogs.com/clyln/),用时两天. 早期思路设计: 采用键值对的形式,以Map作为存储结构.优点:能够将数据与用户对应,缺点:采用java实现过于复杂,工程量过大,需要消耗大量资源,类型转换容易出错. 后期思路设计: 采用二维数组:第一行用于存储用户输入原始数据,第二行用于存储中间数据(第一行的与G值做差的绝对值),第三行用于保存用户得分. 优点:实现简单,易于运算 分

创建第一个servlet程序--HelloServlet

这篇文章是用来纪念我第一次创建一个Servlet程序,步骤我会写得详细点,也可以参考一下,后续我会将SpringMVC 跟ssh的搭建分别更新(ps:不忙的话我会更新) 工具:java jdk 1.6(或以上)   eclipse  tomcat7.0(6.0也行,步骤都差不多) 1.首先,我们先创建一个Dynamic Web Project 接下来给你创建的程序命名,选择你的服务器类型(我这里选择的是tomcat 7.0 所以版本是3.0),输入你的应用名后接下来next就可以了. 勾上红框内

给自己的C++程序创建为一个windows service

因为项目的一些变化和原因,需要把数据处理的一个后台程序创建为一个windows服务,运行以下命令能创建成功: sc create "MyApp Service Name" binPath= "D:/MathxH/Project/SocketService/trunk/MyApp/Win32/Release/MyApp.exe" start= auto 但是因为我的App程序是非服务(non-service)可执行程序,所以在让它运行的时候,却失败了,抛出以下错误:

安装eclipse或者Android STDIO,运行一个安卓程序,并截图。发博客插入图片。

安装Android STDI 运行一个安卓程序,并截图 原文地址:https://www.cnblogs.com/zz2333/p/11448910.html

Android系统默认Home应用程序(Launcher)的启动过程源代码分析

在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个 Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了,本文将详细分析 Launcher应用程序的启动过程. Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而 ActivityManagerService和PackageManagerService一样,都是在开

第一个OpenGL程序

刚开始学习OpenGL,感觉这个挺有趣的(在绘制三维模型时,空间想象能力要求比较高,不然很头疼的). 新东西,新心情...来一发红色三角形. 我就是要通过OpenGL来绘制一个红色的三角形.现在我们来看一下代码: #include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存 glLoadIdentity(); // 重置当前的模型观察矩阵 glTran