AndroidStudio NDK-JNI简单实例

学习使用AndroidStudio中的NDK,在网上看到不少示例,自己照着做了一遍,一些地方作者们没有陈述清楚,于是自己做一遍,记录下来,也方便日后查看。

完整项目源码 https://github.com/JianxunRao/SimpleAndroidNDKDemo

1.创建NDKUtils和NDKTestActivity

前者有一个本地方法getStringFromC();返回一个字符串,这个字符串将要显示在NDKTestActivity中的一个TextView中。

NDKUtils.java

package com.trojx.ndkjnitest;

/**
 * Created by Trojx on 2016/2/21.
 */
public class NDKUtils {
    static {
        System.loadLibrary("JniLibName");//加载库文件
    }
    public native String getStringFromC();
}

NDKTestActivity.java

package com.trojx.ndkjnitest;

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

/**
 * Created by Trojx on 2016/2/21.
 */
public class NDKTestActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ndk_test); TextView textView= (TextView) findViewById(R.id.tv); NDKUtils utils=new NDKUtils(); String stringFromC=utils.getStringFromC(); textView.setText(stringFromC); }}
2. 将文件目录切换为“Project”视图

点击“MakeProject”编译工程

找到app/build/intermediates/classes/debug这个文件目录


之后打开Terminal窗口,输入cd app/build/intermediates/classes/debug,接着输入javah -jni com.trojx.ndkjnitest.NDKUtils,这样就能在当前目录下生成一个NDKUtils这个包含本地方法的java类的.h头文件。




接着,在src/main文件夹下新建一个jni文件夹,再将生成的.h文件剪切到这个目录中,如图所示。



com_trojx_ndkjnitest_NDKUtils.h


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

#ifndef _Included_com_trojx_ndkjnitest_NDKUtils
#define _Included_com_trojx_ndkjnitest_NDKUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_trojx_ndkjnitest_NDKUtils
 * Method:    getStringFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_trojx_ndkjnitest_NDKUtils_getStringFromC
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
jnitest.c

//
// Created by Trojx on 2016/2/21.
//
#include "com_trojx_ndkjnitest_NDKUtils.h"

JNIEXPORT jstring JNICALL Java_com_trojx_ndkjnitest_NDKUtils_getStringFromC
        (JNIEnv *env, jobject obj){
    return (*env)->NewStringUTF(env,"String From C");
}

3.编写c代码实现本地方法,在jni目录新建一个c文件,这里命名它为jnitest.c 。注意,由于AndroidStudio存在一个已知的BUG,我们需要在jni目录新建一个空的c文件再能防止编译时报错。

4.在local.properties文件中添加NDK的地址,如下所示:


5.在build.gradle文件中加入以下两项,添加第二项的原因见这里,如图所示:


6.这时编译还有可能报如下错误,这是因为没有允许使用过时的NDK导致的,在gradle.properties文件中添加一行android.useDeprecatedNdk=true,如图所示:


7.最后编译运行,效果如图所示:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值