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

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


Android JNI/NDK入门指南目录

JNI/NDK入门指南之正确姿势了解JNI和NDK
JNI/NDK入门指南之JavaVM和JNIEnv
JNI/NDK入门指南之JNI数据类型,描述符详解
JNI/NDK入门指南之jobject和jclass
JNI/NDK入门指南之javah和javap的使用和集成
JNI/NDK入门指南之Eclipse集成NDK开发环境并使用
JNI/NDK入门指南之JNI动/静态注册全分析
JNI/NDK入门指南之JNI字符串处理
JNI/NDK入门指南之JNI访问数组
JNI/NDK入门指南之C/C++通过JNI访问Java实例属性和类静态属性
JNI/NDK入门指南之C/C++通过JNI访问Java实例方法和类静态方法
JNI/NDK入门指南之JNI异常处理
JNI/NDK入门指南之JNI多线程回调Java方法
JNI/NDK入门指南之正确姿势了解,使用,管理,缓存JNI引用
JNI/NDK入门指南之调用Java构造方法和父类实例方法
JNI/NDK入门指南之C/C++结构体和Java对象转换方式一
JNI/NDK入门指南之C/C++结构体和Java对象转换方式二




引言

   在前面的章节里面,我们已经了解了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上面。
在这里插入图片描述
2 然后启动Eclipse,进入Externl Tool Configurations然后填入如下截图的相关信息:
在这里插入图片描述
注意这里的Location填入刚才在前面下载的NDK的具体目录,这个不需要过多的解释了。这样NDK环境就配置好了。


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

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

1.创建Android工程JNI,这个不过多细述了
在这里插入图片描述

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 <jni.h>
/* 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 <stdio.h>
#include <android/log.h>
#include <jni.h>
#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库
在这里插入图片描述
在这里插入图片描述

具体编译步骤如下:

[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开发的相关实战内容介绍。青山不改绿水长流,各位江湖见!

原文链接:https://blog.csdn.net/tkwxty/article/details/103580578

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.) 在项目根目录下创建jni目录,下面是要放进去的第一个文件Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := main_jni #LOCAL_CFLAGS := LOCAL_SRC_FILES := main.cpp #LOCAL_LDLIBS := include $(BUILD_SHARED_LIBRARY) 2.) 在jni目录创建main.cpp #include using namespace std; #ifdef __cplusplus extern "C" { #endif class Test { public: Test(){}; ~Test(){}; int SomeFunc() { return 20140522; } }; jint Java_com_yxiaolv_testjni_MainActivity_SomeFunc(JNIEnv *env, jobject thiz) //红色部分必须和你java类包名一致 { Test *test = new Test(); return test->SomeFunc(); } #ifdef __cplusplus } #endif //将下面第3.)至第5.)步的代码片段放到eclipse创建android项目时自动产生的MainAcitivity.java中就可以了 3.) 在Java Activity代码中添加对这个jni的调用 (本例中是MainActivity.java ): static { System.loadLibrary("main_jni"); } 4.) 在调用者Activity中定义函数 native int SomeFunc(); 5.) 在activity中调用 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = new TextView(this); int i = SomeFunc(); tv.setText( String.valueOf(i) ); setContentView(tv); } //下面的第6.)和第7.)步可以被集成的.cproject 和在.project中添加plugin之后一键编译,不用单独起dos窗口了。由于没有找到生成.cproject的工具,只能手写,所以本文不使用该方法,以后找到了好的方法再补充。委屈 6.) 在dos窗口中,cd到项目路径下,运行ndk-build 命令,该命令会自动搜索该路径子目录下的native项目,进行编译。 (Note: 编译完成后不要忘记了刷新项目)。 7.) 重新编译和部署项目,就可以看到已经包含了.so的apk运行在目标机上了。 摘自 http://stackoverflow.com/questions/13654678/how-compile-c-project-via-android-ndk 1). 如果不知道怎样安装和使用windows版的NDK,可以参考 http://blog.csdn.net/do_script/article/details/26478583

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值