NDK开发简单demo

当然事前一定要先配好环境;

下面来说步骤:

    1. 在代码里写入要调用的native方法:

String getData();

String getData2();

    2. 动态链接库;

            System.loadLibrary("ndktest")

    3. 在build.gradle文件中 加入ndk{...}代码:

defaultConfig {
    applicationId "com.hong.ndktest"
    minSdkVersion 19
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    
    ndk{
            moduleName "ndktest"
            abiFilters "armeabi", "armeabi-v7a", "x86"
            }
}

    4. 在main目录下创建 jni 文件夹;

    5. 在jni 文件夹里面创建 .c 文件:

            163146_nwoK_2526599.png

    6. 用javah生成c的头文件
         a,控制台先进入工程的目录下    项目路径\AndroidStudioProjects\NDKDemo\ndkdemo2\src\main>
         b,执行下面命令:
           javah -d jni -classpath D:\AndroidStudio\sdk\platforms\android-23\android.jar;..\..\build\intermediates\classes\debug yourPackageName.MainActivity

    (注释: 红字 23 这里要根据你build.gradle文件中的 tartgetSdkVersion 更改);

        当回车之后没有反应 就成功了,在jni文件夹里可以看到生成的头文件(在第5步的图片中" com_hong_ndktest_MainActivity.h" 便是生成的头文件)

        163928_7LXF_2526599.png

        7. 生成头文件成功后,会在  build\intermediates\ndk\debug 中生成 .mk 文件。打开头文件,里面有 对应的 native 方法(方法签名都省了):

    

164936_MmRm_2526599.png

/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData
 * Signature: ()Ljava/lang/String;
 */

JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData
  (JNIEnv *, jobject);
/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData2
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData2
  (JNIEnv *, jobject);

   


8.  把对应的方法黏贴到 .c 文件中,并填写逻辑代码,不要忘了把include<>也黏贴过去:

//
// Created by Hong on 2016/3/30.
//
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_hong_ndktest_MainActivity */

#define _Included_com_hong_ndktest_MainActivity
/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData
        (JNIEnv * env, jobject jobj) {
        return (*env)->NewStringUTF(env, "from C");
}

/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData2
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData2
        (JNIEnv *env, jobject jobj) {
        return (*env)->NewStringUTF(env, "fromCgetData2");
}

                   

9. 在 java 端可以调用 c 了;

    ==================================分割线就是我可恨=======================

下面粘贴源码:

    MainActivity;

package com.hong.ndktest;

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

public class MainActivity extends Activity {
    TextView tv_show;
    {
        System.loadLibrary("ndktest");//加载库
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_show = (TextView) findViewById(R.id.tv_show);
    }

    /*
     * button 点击事件
     */
    public void show(View view) {
        String data = getData()+"===="+getData2();//调用native方法
        tv_show.setText(data);
    }

    //声明native方法
    public native String getData();
    public native String getData2();

}


TestJNI.c

#include <jni.h>

#define _Included_com_hong_ndktest_MainActivity
/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData
        (JNIEnv * env, jobject jobj) {
        return (*env)->NewStringUTF(env, "from C");
}

/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData2
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData2
        (JNIEnv *env, jobject jobj) {
        return (*env)->NewStringUTF(env, "fromCgetData2");
}


效果:

    

171523_ZLRZ_2526599.png

点击button后:

    

171609_9xij_2526599.png


最后说一句:如果项目报错的话 在 gradle.properties 文件中最后一行添加如下语句:

android.useDeprecatedNdk=true

demo下载地址: http://download.csdn.net/download/qq_33363534/9477065

转载于:https://my.oschina.net/u/2526599/blog/649998

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值