首先要下载eclipse_java,安装ADT,CDT,NDK,

在MainActivity中写一些本地函数声明:

    public native void fun1();    public native String fun2();    public native char fun3();    public native int fun4();    public native double fun5();    public native void fun6(int i, String s);

配置好Java环境变量;


Android中使用jni进行本地开发_第1张图片

然后控制台进入项目的bin/classes,输入javah -jni命令,生成相关.h头文件;



如果报找不到Activity类的话可以暂时去掉MainActivity中的extends Activity声明,并把与Activity相关代码注释,再次编译后运行javah -jni,就没有错了,这时生成一个.h头文件,com_example_jnitest_MainActivity.h

在工程中创建jni目录,把头文件移动到里面,头文件里包含了以后要在.c文件中书写的函数:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_jnitest_MainActivity */#ifndef _Included_com_example_jnitest_MainActivity#define _Included_com_example_jnitest_MainActivity#ifdef __cplusplusextern "C" {#endif/* * Class:     com_example_jnitest_MainActivity * Method:    fun1 * Signature: ()V */JNIEXPORT void JNICALL Java_com_example_jnitest_MainActivity_fun1  (JNIEnv *, jobject);/* * Class:     com_example_jnitest_MainActivity * Method:    fun2 * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_fun2  (JNIEnv *, jobject);/* * Class:     com_example_jnitest_MainActivity * Method:    fun3 * Signature: ()C */JNIEXPORT jchar JNICALL Java_com_example_jnitest_MainActivity_fun3  (JNIEnv *, jobject);/* * Class:     com_example_jnitest_MainActivity * Method:    fun4 * Signature: ()I */JNIEXPORT jint JNICALL Java_com_example_jnitest_MainActivity_fun4  (JNIEnv *, jobject);/* * Class:     com_example_jnitest_MainActivity * Method:    fun5 * Signature: ()D */JNIEXPORT jdouble JNICALL Java_com_example_jnitest_MainActivity_fun5  (JNIEnv *, jobject);/* * Class:     com_example_jnitest_MainActivity * Method:    fun6 * Signature: (ILjava/lang/String;)V */JNIEXPORT void JNICALL Java_com_example_jnitest_MainActivity_fun6  (JNIEnv *, jobject, jint, jstring);#ifdef __cplusplus}#endif#endif

与java原文件中相应的native函数都已经在这个头文件中声明好了,以后只要按相应的函数名书写函数,就可以在java原文件中调用。

写一个Android.mk文件,该文件说明了.c文件编译的相关信息:



LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := myjniLOCAL_SRC_FILES := main.cinclude $(BUILD_SHARED_LIBRARY)

其中指明了将main.c便以为myjni;

所以开始写一个main.c

#include<jni.h>#include<string.h>void JNICALL Java_com_example_jnitest_MainActivity_fun1  (JNIEnv *, jobject);jstring Java_com_example_jnitest_MainActivity_fun2  (JNIEnv *e, jobject o){return (*e)->NewStringUTF(e, "I am a string from jni, good!");}jchar Java_com_example_jnitest_MainActivity_fun3  (JNIEnv *, jobject);jint Java_com_example_jnitest_MainActivity_fun4  (JNIEnv *, jobject);jdouble Java_com_example_jnitest_MainActivity_fun5  (JNIEnv *, jobject);void Java_com_example_jnitest_MainActivity_fun6  (JNIEnv *, jobject, jint, jstring);

至于语法可以参考其他资料

然后就要为项目添加C编译器来将C代码编译成so文件以便调用:

单击项目->属性:


Android中使用jni进行本地开发_第2张图片

在builders选项卡中选new,添加一个Program编译器:


Android中使用jni进行本地开发_第3张图片
编译器配置界面:


Android中使用jni进行本地开发_第4张图片
Location是NDK解压目录下的ndk-build.cmd

WorkingDirectory选择当前项目空间,保存


Android中使用jni进行本地开发_第5张图片

这时编译器列表中多了一个编译器,将其通过Up移到最高处,以使C代码能在最先编译

每次便以项目时:Console会显示:

"Compile thumb : myjni <= main.cSharedLibrary  : libmyjni.soInstall        : libmyjni.so => libs/armeabi/libmyjni.so

说明编译成功,项目中的lib多了.so文件:


Android中使用jni进行本地开发_第6张图片
在java代码中通过以下声明调用该链接库:

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


Android中使用jni进行本地开发_第7张图片

NDK目录下samples文件夹下提供了一些实例可供参考

更多相关文章

  1. android中选择文件,部分手机找不到文件路径问题的解决
  2. android 获取配置文件 相对路径
  3. Android关于读取临时文件
  4. Android下载并打开pdf文件
  5. Android HTTP GET 小文件下载
  6. Android中播放mp3文件
  7. Android 文件的下载

随机推荐

  1. Android简明开发教程二十:Broadcast Recei
  2. android系统开发小问题-启动过程中android
  3. Android Android 导入Flutter模块(二)--
  4. 设置TextView文字居中,代码实现android:l
  5. 软件架构:基础概念总结
  6. Android中视频播放以及解码
  7. 关于ImageView的一些图片属性
  8. Android轻量级缓存框架ASimpleCache
  9. 如何查看无法导出的android数据库文件?
  10. Android(安卓)增强版百分比布局库 为了适