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

时间:2021-03-22 08:58:23

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


IDE用的是Androidstudio。

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

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

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

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

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

在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);
    }
}

模拟器中显示如下:

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

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