记:Android NDK 的配置和使用

摘要:
1、 NDK配置:从ndkr7开始,不再需要cygwin;右键单击项目,单击属性,在Builders窗口中创建新程序,然后输入名称;在主选项卡上,在ndk目录Cmd中选择ndk build,在WorkingDirectory中选择当前项目;在“刷新”选项卡上,选中以下选项:切换到“BuildOptions”选项卡,选中

一、NDK配置:

  从ndk r7开始,不再需要cygwin;

  选择项目单击右键,点击Properties,在Builders窗口中新建一个program,输入名称;

  在main标签页的location选择ndk目录中的ndk-build.cmd,在Working Directory选择当前项目;

    记:Android NDK 的配置和使用第1张

  在Refresh标签页,勾选如下选项:

    记:Android NDK 的配置和使用第2张

  切换到Build Options标签页,勾选如下选项:

    记:Android NDK 的配置和使用第3张

  勾选完成,点击右边的 Specify Resources 按钮,选择项目的jni目录:

    记:Android NDK 的配置和使用第4张

  点击finish完成配置;

二、测试NDK:

  编MainActivity.java文件(我在这个文件中使用的c代码里的函数),

package com.example.hellojni;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = new TextView(this);
        tv.setText(sayHello());
        setContentView(tv);
    }
    
    private native String sayHello();
    
    static{
        System.loadLibrary("HelloJni");
    }
}
                    

  代码中新建了一个 TextView ,在设置显示文本的时候调用 sayHello() 方法,这个方法就是即将在C代码里编写的方法。

  private native String sayHello();

  这一行声明了被调用的本地方法;

  static {

    System.loadLibrary("HelloJni");

  }

  代码在onCreate之前调用,加载了由C代码编译来的库文件。

  接下来利用MainActivity.java文件生成我们需要的.h文件:

  打开cmd,进入本项目的src目录下,运行

  javah -jni com.example.hellojni.MainActivity  (也可以不加 -jni 参数,因为它是默认的)

    记:Android NDK 的配置和使用第5张

  运行后可以看到生成了一个.h文件,内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_hellojni_MainActivity */

#ifndef _Included_com_example_hellojni_MainActivity
#define _Included_com_example_hellojni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_hellojni_MainActivity
 * Method:    sayHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

  将其移到jni目录下,根据.h文件中声明的函数,在.c文件中实现函数体,在jni目录新建hellojni.c :

#include <string.h>
#include <jni.h>

JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_sayHello(
        JNIEnv *env, jobject thiz) {
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}

  在jni目录中再新建一个Android.mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := HelloJni
LOCAL_SRC_FILES := hellojni.c

include $(BUILD_SHARED_LIBRARY)

  Android.mk相当于makefile文件;想了解更多可以参考 :http://blog.csdn.net/xuxinyl/article/details/6555762

  然后保存项目,就可以自动生成库文件了,可在libs目录找到。

  如果没有生成,请查看console中有没有显示信息,可以根据这些信息找一下原因。

免责声明:文章转载自《记:Android NDK 的配置和使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇GWAS 画曼哈顿图,QQ plot,膨胀系数manhattan、Genomic Inflation Factor[转]热插拔原理和应用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IOCP九:Client退出后投递WSASend

实验过程:         过程一:                 1.Server等待Client到来                2.Client进入                3.Server接受连接,发送"nihaihaoma"                4.Client接收"nihaihaoma",马上退出             ...

线程.Qt更新界面

1、信号&槽 机制 即可  ZC:个人暂时 测试下来,类似是 PostMessage(...)的方式:   a、是在各自的线程中执行代码,   b、调用 emit不耗时(指的意思是 像调用PostMessage(...)一样 扔完就算,具体 slot中需要执行多久 不关“emit ???()”的事) 2、测试代码:  2.1、h #ifndef M...

如何用c语言调用c++做成的动态链接库

今天在做东西的时候遇到一个问题,就是如何在C语言中调用C++做的动态链接库so文件如果你有一个c++做的动态链接库.so文件,而你只有一些相关类的声明, 那么你如何用c调用呢,别着急,本文通过一个小小的例子,让你能够很爽的搞定.   链接库头文件:head.h class A { public: A();...

实现socket非阻塞设置

刚开始学习,难免有些疏漏之处,请各位多多指教。 程序亲测可以使用。废话不多说。 网络IO模型分为阻塞IO、非阻塞IO、异步IO、IO复用、信号驱动IO。 阻塞IO: 有数据时,直接读;没有数据时,等待读。 非阻塞IO: 无论内核有没有数据都读。 以下是程序: 1. serevr.c 1 #include <stdio.h> 2 #include...

cygwin配合NDK开发Android程序

一、NDK NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so 和java 应用一起打包成apk。怎么在eclipse装这两个我就不多说了。大家按照以前装adt和sdk的方法来搞就好了。不过有一点是要注意的:因为cygwin是在window上模拟linux的控制台环境,所以对于访问文件的路径是不能带有空格的,貌似也不能带中...

maven filters 和 resource

1 filter 1.1 用途 对多个配置文件进行选择。 1.2 选择的依据 1.3 使用的方式 第一,在<resource>标签下面加<filtering>标签,并且<filtering>标签的值设置为true; 第二,添加<filters>标签,添加<filter>,并且值中使用env变量 第...