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的第一个程序开发完毕。