记:Android NDK 的配置和使用

一、NDK配置:

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

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

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

    

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

    

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

    

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

    

  点击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 参数,因为它是默认的)

    

  运行后可以看到生成了一个.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中有没有显示信息,可以根据这些信息找一下原因。

原文地址:https://www.cnblogs.com/ren-gh/p/3625190.html