zoukankan      html  css  js  c++  java
  • 记: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中有没有显示信息,可以根据这些信息找一下原因。

  • 相关阅读:
    如何将CentOS的默认启动界面修改为图形界面or字符界面
    如何将CentOS的默认启动界面修改为图形界面or字符界面
    virtualbox下CentOS7安装增强功能
    蓝牙4.0
    HC-SR04超声波测距
    STM32F407 通用同步异步收发器(串口)
    STM32F4 TIM(外设定时器)
    STM32F4 系统定时器
    STM32F4 异常与中断
    LED和按键实验
  • 原文地址:https://www.cnblogs.com/ren-gh/p/3625190.html
Copyright © 2011-2022 走看看