安卓NDK开发

NDK首先是环境的搭建,在Studio中依次选择Preferences-Appearance&Behavior-System Settings-Android SDK,选择SDK Tools,在其中进行NDK的下载
这里写图片描述

在创建新项目时,在local.properties文件中如果显示

这里写图片描述

则证明已经配置完成。
下面完成一个简单的Demo,从native中获取hello world并显示在屏幕上。
在Activity只有一个TextView用以显示文字

package com.example.jniapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Test t = new Test();
        ((TextView)findViewById(R.id.tv)).setText(t.get());
    }
}

其中的类Test为

package com.example.jniapp;


public class Test {
    static {
        System.loadLibrary("jni-test");
    }

    public native String get();

    public native void set(String str);
}

显示native需要实现get与set两个方法。
下面我们使用终端首先定位到我们项目中包的位置,然后分别调用javac生成class文件,之后调用javah生成JNI的头文件,具体的命令为:

javac com/example/jniapp/Test.java
javah com.example.jniapp.Test

之后会生成一个com_example_jniapp_Test.h文件,内容如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jniapp_Test */

#ifndef _Included_com_example_jniapp_Test
#define _Included_com_example_jniapp_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jniapp_Test
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_jniapp_Test_get
  (JNIEnv *, jobject);

/*
 * Class:     com_example_jniapp_Test
 * Method:    set
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_example_jniapp_Test_set
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

之后我们在项目根目录下创建一个jni文件夹,里面创建三个文件:test.cpp,Android.mk,Application.mk。具体内容是,test.cpp:

#include <jni.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jstring JNICALL Java_com_example_jniapp_Test_get
  (JNIEnv *env, jobject thiz){
  printf("invole get from C++\n");
      return env->NewStringUTF("Hello world!");
  }



JNIEXPORT void JNICALL Java_com_example_jniapp_Test_set
  (JNIEnv *env, jobject thiz, jstring string){
  printf("invole set from C++\n");
  char* str = (char*)env->GetStringUTFChars(string,NULL);
  printf("%s\n",str);
  env->ReleaseStringUTFChars(string,str);
  }


 #ifdef __cplusplus
 }
 #endif

可以看到,test.cpp就是对com_example_jniapp_Test.h中的函数进行了具体的实现。

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE :=jni-test

LOCAL_SRC_FILES :=test.cpp

include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE表示模块的名称,即是我们在java层中调用System.loadLibrary(“jni-test”)中的参数,LOCAL_SRC_FILES表示参与编译的源文件,即test.cpp

Application.mk:

APP_ABI := armeabi

他表示CPU的架构平台类型,也就是我们平时看的armeabi,x86,mips等,我们也可以写成APP_ABI := all,这样所有的平台的so文件都会生成。

接着又到了我们的终端的工作,首先切换到jni目录的父目录,接着输入

/Users/xw/Library/Android/sdk/ndk-bundle/ndk-build

其中在ndk-build前面的就是在我们local.properties文件中的ndk路径,然后ndk会创建一个和jni目录平级的libs目录,里面就有生成的各个平台的so文件。
然后我们在main目录下创建jniLibs目录,将生成的so文件复制进去,然后通过Studio编译运行即可。

Demo下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值