JNI/NDK入门指南之Eclipse集成NDK开发环境并使用

    JNI/NDK入门指南之Eclipse集成NDK开发环境并使用

   在前面的章节里面,我们已经了解了JNI开发所需要掌握的相关基本知识。那么在本篇文章里面将要介绍Eclipse集成NDK开发环境。



配置使用步骤

这里我会以一个简单的Android中使用JNI开发的列子来说明,怎么在Eclipse中集成NDK开发环境并使用之。

1.Eclipse配置NDK开发环境

在前面的章节JNI/NDK开发指南之javah和javap的使用和集成里面我们有介绍了怎么在Eclipse环境中配置javah环境,在Eclipse环境中配置NDK开发环境也是类似的。下面跟着我一步一步的进行相关的操作。
1.下载NDK开发包下载,打开如下网站https://developer.android.google.cn/ndk/downloads/,可以看到提供了最新NDK版本的信息,这个根据具体情况选择下载版本,譬如是你在windows上面开发还是在mac上还是在linux上面。
JNI/NDK入门指南之Eclipse集成NDK开发环境并使用_第1张图片
2 然后启动Eclipse,进入Externl Tool Configurations然后填入如下截图的相关信息:
JNI/NDK入门指南之Eclipse集成NDK开发环境并使用_第2张图片
注意这里的Location填入刚才在前面下载的NDK的具体目录,这个不需要过多的解释了。这样NDK环境就配置好了。


2.Eclipse下使用NDK开发简单实例

好了通过前面的步骤,我们已经配置好了NDK的开发环境了,那么接下来我们演示一下怎么使用NDK开发一个简单的JNI的Android工程。

1.创建Android工程JNI,这个不过多细述了
JNI/NDK入门指南之Eclipse集成NDK开发环境并使用_第3张图片

2.新建一个JNI.java文件,并在里面使用native方法和加载so库,代码如下,非常简单。

package com.xxx.jni;

public class JNI {
    public native void helloNative();
    
    static {
        System.loadLibrary("jni");//加载so库
    }
}

3 使用javap工具生成对应头文件,头文件的内容如下。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_xxx_jni_JNI */

#ifndef _Included_com_xxx_jni_JNI
#define _Included_com_xxx_jni_JNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_xxx_jni_JNI
 * Method:    helloNative
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_xxx_jni_JNI_helloNative
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4 在Android工程的jni目录里面,创建一个hello_jni.cpp的文件,并实现Java_com_xxx_jni_JNI_helloNative实现一个简单的字符打印。

#include "com_xxx_jni_JNI.h"
#include 
#include 
#include 


#define TAG "JNI"
#define LOGE(TAG,...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)
JNIEXPORT void JNICALL Java_com_xxx_jni_JNI_helloNative
  (JNIEnv * env, jobject jobject){
	LOGE(TAG,"Java_com_xxx_jni_JNI_helloNative");
}

5 Android,mk的编写,这里我将会介绍怎么使用Android.mk生成so动态库,因为JNI的开发中主要是用到so库。

LOCAL_PATH:= $(call my-dir)  #获取当前目录
include $(CLEAR_VARS)		 #清空环境变量
LOCAL_MODULE_TAGS :=optional
LOCAL_C_INCLUDES := $(KERNEL_HEADERS)
LOCAL_SHARED_LIBRARIES := libcutils liblog	libutils #导入库
LOCAL_LDLIBS := -llog   #引入库

LOCAL_MODULE:= libjni		#so库的名称
LOCAL_SRC_FILES:= com_xxx_jni_JNI.cpp
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)

6 使用NDK生成so库。执行如下截图所示的操作,最终的libs下面生成so库
JNI/NDK入门指南之Eclipse集成NDK开发环境并使用_第4张图片
JNI/NDK入门指南之Eclipse集成NDK开发环境并使用_第5张图片

具体编译步骤如下:

[armeabi] Compile++ thumb: jni <= com_xxx_jni_JNI.cpp
[armeabi] SharedLibrary  : libjni.so
[armeabi] Install        : libjni.so => libs/armeabi/libjni.so

7 在Android工程中使用,并查看打印信息。

package com.xxx.jni;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

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

    
    
    private void fun(){
        JNI jni = new JNI();
        jni.helloNative();
    }
}

查看JNI调用打印,大功告成。

λ adb logcat  -s JNI
--------- beginning of main
--------- beginning of system
12-17 16:20:23.469 28000 28000 I JNI     : Java_com_xxx_jni_JNI_helloNative


写在最后

   好了到这里,JNI开发的前期知识和准备工作已经都OK了。在接下来的篇章中我们接着继续JNI开发的相关实战内容介绍。

你可能感兴趣的:(JNI/NDK入门指南)