NDK开发

HelloJni工程的搭建

在建立NDK工程之前要进行环境的搭建,有以下两个方面需要搭建的:

NDK系统环境变量的配置

去android developer官网选择NDK下载相应的ndk版本,我选择的是ndk-r9d版本,安装完以后要进行系统环境变量的配置,将ndk的安装目录配置到Path系统环境变量中,配置好之后打开cmd执行ndk-build出现如下画面则配置成功。
这里写图片描述

eclipse开发环境的配置

eclipse安装ADT(这个是安卓的开发环境搭建);

开始编写NDK工程:

新建一个安卓工程HelloJni,在MainActivity里声明native方法

public static native String getStringFromC();

打开cmd进入到HelloJni的根目录下

cd E:\MyProject\eclipsem\HelloMyJni

使用javah命令生成相应的.h头文件

javah -classpath bin/classes;D:\adt-bundle-windows-x86_64-20130522\sdk\platforms\android-17\android.jar -d jni com.example.hellomyjni.MainActivity

javah 命令用于生成头文件,参数是生成.h文件的相应的类(全类名);
-classpath 指定类的加载目录(有两个类一个是位于bin下的MainActivity和sdk下的android.jar包的Activity类,用分号隔开);
-d 表示输出路径在jni文件夹下;

生成之后会在项目工程的jni目录下发现com_example_hellomyjni_MainActivity.h文件
然后为项目添加native支持:项目右键->Android Tools-> add native support
此时打开.h文件出现错误如下图
错误
这个是因为没有导入jni头文件的原因。
Project Properties -> C/C++ General -> Path and Symbols
选择include标签,Add -> File system -> 选择ndk安装目录下的\platforms\android-17\arch-arm\usr\include
且选中All languages.
最后Apply -> OK
这样错误就解决了。

接下来就是实现刚才定义的getStringFromC();方法了
修改jni目录下的HelloJni.cpp文件(没有则创建),实现以下代码:

#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include "com_example_hellomyjni_MainActivity.h"

JNIEXPORT jstring JNICALL       Java_com_example_hellomyjni_MainActivity_getStringFromC
  (JNIEnv * env, jclass jclass){
    return (*env)->NewStringUTF(env,"Hello from JNI");
}

这样我们就实现了Java_com_example_hellomyjni_MainActivity_getStringFromC函数了。

接下来在jni目录下还要有一个Android.mk文件声明要编译的内容,修改(没有则新建,添加一下代码

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := HelloMyJni
LOCAL_SRC_FILES := HelloMyJni.c

include $(BUILD_SHARED_LIBRARY)

其中LOCAL_MODULE表示生成的.so库的名称,LOCAL_SRC_FILES表示要编译的c文件名称,自行修改

修改完之后就要进行ndk-build命令了,cmd进入项目根目录下,执行ndk-build之后再项目的obj文件夹下就生成了.so文件

在MainActivity中加载so库:

public class MainActivity extends Activity {
    static{
        System.loadLibrary("HelloMyJni");
    }
    public static native String getStringFromC();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(getStringFromC());
    }
}

运行可见textview已经获得了从jni创建的字符串了
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值