基于eclipse进行ndk开发的环境配置

前述

虽然我们在其他的博文中(如https://blog.csdn.net/ericbar/article/details/76602720),早就用到了ndk,但如果想在Android设备运行包含这些so的应用程序,还需要将这些so打包到apk里去。
现在主流的Android开发IDE工具是Android Studio,但是本文还是从eclipse入手进行讲述。

指定NDK的位置

打开eclipse,从菜单栏依次选择,Windows——Preferences——Android,通过Browser选择ndk正确的路径,OK完成。
ndk路径

项目添加原生支持

所谓原生支持,就是本地支持,也就是native支持,也就是支持JAVA和C/C++混编。为了测试,我们先建立一个Android项目,比如helloworld,一路自动就好了。
接下来,选中项目名,右键->Android Tools->Add Native Support,
原生支持
如果是第一次为此项目添加原生支持,会弹出对话框,需要指定so库的名字,如下所示,
指定库名
这时会在项目中生成一个jni目录,并且自动添加了helloworld.cpp文件。

JAVA里的JNI调用

jni是java native interface的简写,可以通过它实现java和本地c/c++的互相调用,我们在上述例子MainActivity类里,添加对本地接口函数nativeHelloWorld的调用,

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

并声明如下,注意前面的native关键字,

public native void nativeHelloWorld();

加载so共享库

在实现nativeHelloWorld本地方法之前,我们先在MainActivity类里加载libhelloworld.so本地库,参考如下方式,

static {
    System.loadLibrary("helloworld");
}

配置eclipse的javah

从菜单栏选择Run->External Tools->External Tools Configurations,左侧栏里选中Program,单击左上角的New launch configuration,再单击Main选项卡, 按照如下信息填写,需要确保Android sdk路径下有类似android-19的文件夹,根据自己sdk实际情况调整,

NAME:  Generate C and C++ Header File
Location:  ${system_path:javah}
Working Directory:  ${project_loc}/jni
Arguments:  -classpath "${project_classpath};${env_var:ANDROID_SDK_HOME}/platforms/android-19/android.jar" ${java_type_name}

重新配置

接下来,切换到Refresh选项卡,选中Refresh resource upon completion复选框,并在列表中选择The project containing the selecte resource,如下图,

javah_refresh

切换到Common选项卡,选中Display in favorites menu组下面的复选框External Tools,如下图,

javah_common

点击Apply保存配置信息。

通过javah产生头文件

首先必须在左侧的项目栏里,选中包括本地方法声明的java类,一定不要选中在项目上。接下来,点击菜单栏里的Run->External Tools->Generate C and C++ Hearder File,java工具将自动产生对应的头文件。

如果此时遇到 “Unable to launch cygpath” 之类的错误,需要做如下配置:
在项目上点右键,Properties->C/C++ Build,选中Building Settings选项卡,去掉Use default build command,然后输入${NDKROOT}/ndk-build.cmd,如下图,

build

接下来,在左侧的C/C++ Build中点击Environment,点Add…添加环境变量NDKROOT,值为NDK的根目录,例如我的是D:\eclipse2016\android-ndk-r9d-windows-x86_64\android-ndk-r9d,如下图,

ndkroot

确定后,再次按照前述方法,应该可以顺利的产生jni的头文件了。

最后,如果仍然遇到如下报错,一定是android.jar没找到,需要检查前面的配置是否正确,

错误: 无法访问android.app.Activity
  找不到android.app.Activity的类文件

比如,我的默认配置如下,一定要确保sdk/platforms/android-19/android.jar下文件存在,

-classpath "${project_classpath};${env_var:ANDROID_SDK_HOME}/platforms/android-19/android.jar" ${java_type_name}

如果还报错,那就是环境变量ANDROID_SDK_HOME没有配置上,参考下图配置系统环境变量即可。

ANDROID_SDK_HOME环境变量

编写原生代码

通过前述步骤,已经在helloworld项目中jni目录下生成了com_example_helloworld_MainActivity.h文件,我们在helloworld.cpp里实现对应声明的方法即可。只有如下一个函数需要实现,

JNIEXPORT void JNICALL Java_com_example_helloworld_MainActivity_nativeHelloWorld
  (JNIEnv *, jobject);

具体代码如下,一定要记得添加com_example_helloworld_MainActivity.h头文件的引用,否则可能运行时找不到函数,但是可以编译通过,出现莫名其妙的错误。这里的log输出借助Android的原生实现,所以,需要在Android.mk里添加LOCAL_LDLIBS += -llog 。

#include <jni.h>
#include <stdio.h>
#include <android/log.h>
#include "com_example_helloworld_MainActivity.h"

#define TAG "helloworld"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)

JNIEXPORT void JNICALL Java_com_example_helloworld_MainActivity_nativeHelloWorld
  (JNIEnv *, jobject)
{
    LOGV("This is jni hello world. ");
}

运行程序,可以在logcat窗口里看到如下结果,

05-09 22:52:54.801: V/helloworld(10412): This is jni hello world. 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值