[Android开发]Mac下NDK开发(JNI)

Mac下Android调用C/C++程序的实现(JNI)


IDE用的是Androidstudio。

首先,我们需要配置Mac下的NDK环境,比较简单,参考博客:

Mac下Android studio 之NDK配置教程(一)
Mac下Android studio 之NDK配置教程(二)

好,接下来我们就开始写我们在Mac下的第一个NDK程序。

第一步:首先,新建一个项目,项目截图如下:

这里写图片描述

在NavHelper中定义JNI的接口:

public static native String getTextStringFromNativate();
public native String print(String msg);
第二步:生成JNI相关文件

记住,写好代码后记得Build->Rebuild Project。

localhost:~ dream$ cd /workspace/NDKDemo/app/src/main 

注意workspace是你自己的路径,接下来采用javah来生成C头文件

localhost:main dream$ javah -d jni -classpath ../../build/intermediates/classes/debug/ -jni com.geniusvjr.ndkdemo.NavHelper

运行完成后,回到Android Studio下面,你会发现在main的同级目录下,生成了一个叫jni的文件夹,并生成了文件:

com_geniusvjr_ndkdemo_NavHelper.h

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

#ifndef _Included_com_geniusvjr_ndkdemo_NavHelper
#define _Included_com_geniusvjr_ndkdemo_NavHelper
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_geniusvjr_ndkdemo_NavHelper
 * Method:    getTextStringFromNativate
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_geniusvjr_ndkdemo_NavHelper_getTextStringFromNativate
  (JNIEnv *, jobject);

/*
 * Class:     com_geniusvjr_ndkdemo_NavHelper
 * Method:    print
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_geniusvjr_ndkdemo_NavHelper_print
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

接下来自己新建一个c文件:main.c来实现接口中的方法:

//
// Created by 陶程 on 16/3/12.
//

#include "com_geniusvjr_ndkdemo_NavHelper.h"

JNIEXPORT jstring JNICALL Java_com_geniusvjr_ndkdemo_NavHelper_getTextStringFromNativate
        (JNIEnv * env, jobject object){
    return (*env)->NewStringUTF(env,"这是C语言程序");

}

JNIEXPORT jstring JNICALL Java_com_geniusvjr_ndkdemo_NavHelper_print
        (JNIEnv * env, jobject object, jstring str){
    return (*env)->NewStringUTF(env,"Java_dzq_ndk_NavHelper_print");
}
第三步:编译——运行

首先配置好Android Studio的NDK路径,打开项目根目录下 local.properties 文件,追加ndk.dir(NDK的路径)

ndk.dir=//Users/dream/Documents/bin/android-ndk-r10e 

然后在app目录下的 build.gradle中设置需要生成的库文件名(生成的so文件名):

ndk
    {
       moduleName "Jni"  //设置库(so)文件名称
    }

Tips:将这段代码加在defaultConfig 这项里面

在NavHelper类中加载:

static {  
    System.loadLibrary("Jni");  
}

最后一步的配置,打开项目根目录下面的:gradle.properties 加上以下代码

android.useDeprecatedNdk=true

我们在MainActivity里面写一些显示的代码:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        String says = NavHelper.getTextStringFromNativate();
        tv.setText(says);
        setContentView(tv);
    }
}

模拟器中显示如下:

这里写图片描述

至此,NDK的第一个程序开发完毕。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值