Android studio ndk开发--简单的例子

介绍apk中Java调用native代码的简单例子。

  • Java部分
  • 生成jni头文件
  • native部分
  • 编译

java部分

首先使用Android studio新建一个project。
在你的class(我这里是在com.example.jayawei.testjniapp.MainActivity中)中添加使用的library以及native方法声明:

package com.example.jayawei.testjniapp;

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

public class MainActivity extends AppCompatActivity {
    final String TAG = "TestJniApp";

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


    static {
        System.loadLibrary("testjni");
    }
    public static native String getStr();
}

然后Build->Build Module ‘app’

生成jni头文件

  • New->Folder->JNI Folder添加一个jni文件夹

  • 使用javah命令生成头文件

E:\AndroidProject\TestJniApp\app\src\main\java>javah -d ../jni com.example.jayawei.testjniapp.MainActivity

这样jni文件夹中就会多出一个头文件com_example_jayawei_testjniapp_MainActivity.h,内容如下:

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

#ifndef _Included_com_example_jayawei_testjniapp_MainActivity
#define _Included_com_example_jayawei_testjniapp_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jayawei_testjniapp_MainActivity
 * Method:    getStr
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_jayawei_testjniapp_MainActivity_getStr
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

头文件中声明了getStr对应的native方法。

native部分

//
// Created by Administrator on 2016/3/19.
//
#include "com_example_jayawei_testjniapp_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_example_jayawei_testjniapp_MainActivity_getStr
        (JNIEnv * env, jclass c){
    return (*env)->NewStringUTF(env,"Native String!!!");
}

编译

  • 在build.gradle(Module: app)的defaultConfig配置中添加native库名:
    defaultConfig {
        applicationId "com.example.jayawei.testjniapp"
        minSdkVersion 19
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        ndk{
            moduleName "testjni"  //设置.so库的名称,和System.loadLibrary()中的名称一样
        }
    }
  • make project
    这个时候make project会报错
Error:(13, 0) Error: NDK integration is deprecated in the current plugin.  Consider trying the new experimental plugin.  For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental.  Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.
<a href="openFile:E:\AndroidProject\TestJniApp\app\build.gradle">Open File</a>

根据提示,在gradle.properties中添加android.useDeprecatedNdk=true,再make Project就不会报错。

  • run apk
    这时候跑apk,界面上会出现 “Native String!!!”,成功调用到了native方法!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值