第八篇:jni的开发流程规范

来源:互联网 发布:java编程视频教程 编辑:程序博客网 时间:2024/05/16 19:33

今天我们来探讨一下基于Eclipse的jni开发流程规范

  • 1.在Java代码中声明一个native方法。让C来实现里面的逻辑。如

    public native String helloFromC();
    • 1
  • 2.在Eclipse的工程下面创建出来一个的文件夹,起名为jni

  • 3.编写C代码,按照规范进行编写

    jstring Java_com_yyh_jni_MainActivity_helloFromC(JNIEnv* env,jobject obj){  //c代码;  char* str = "hello from c 123!!";  //在jni规范里面 在jni环境的结构体里面  //jstring     (*NewStringUTF)(JNIEnv*, const char*);  //转化成了java的字符串  return (*(*env)).NewStringUTF(env,str);}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 4.配置Android.mk文件,有时候根据实际需要配置Application.mk

  • 文件

Android.mk

#指定编译的文件夹  指定当前文件目录LOCAL_PATH := $(call my-dir)#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。include $(CLEAR_VARS)LOCAL_MODULE    := helloLOCAL_SRC_FILES := hello.cinclude $(BUILD_SHARED_LIBRARY)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Application.mk

  • 5.编译指令C代码:ndk-build.cmd

  • 6.生成一个.so动态链接库

  • 7.在Java代码中调用动态链接库(.so)

    {   System.loadLibrary("hello");}
    • 1
    • 2
    • 3
  • 8.调用jni方法,把他作为普通方法

    btn_onClicl.setOnClickListener(new OnClickListener() {          @Override          public void onClick(View v) {              String ss = helloFromC();              Toast.makeText(MainActivity.this,ss, Toast.LENGTH_SHORT).show();          }      });}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

基于Androidstudio的开发流程配置

前提条件

  • 需要安装最新版的Java
  • 之后要去先下载最新的Android Studio:
https://developer.android.com/studio/index.html
  • 1
  • 也可以使用国内的镜像网站
    [http://www.android-studio.org/ ] 
    (http://www.android-studio.org/) 下载。

    Android Studio 会自动下载Android SDK,Gradle等开发工具。 
    而NDK就需要自己手动安装了。

http://www.cnblogs.com/why168888/p/5592017.html

手动配置

一、下载ndk的安装包进行配置

  • 下载地址: 
    http://developer.android.com/sdk/ndk/index.html

    打开下载页面后选择的下载文件为

    android-ndk-r12-windows-x86_64.zip。 
    或者我这边已经下载好。百度云盘链接:

    链接:http://pan.baidu.com/s/1miLqaY8 密码:1o5d

    • 配置环境变量

    image

  • 我们测试环境变量的配置成功与否。在cmd命令行窗口输入“ndk-build”,输出以下信息即为配置正确。如图: 
    image

  • 点击AndroidStudio菜单栏找到”File”-“Project Structure…”,打开界面,进行Android ndk路径配置

  • 接着在Android NDK Location中,选择刚才解压的NDK系统文件路径,配置之后,在项目的local.properties配置文件中看到NDK路径,说明我们配置成功 !

二、插件化进行配置

  • 相关配置地址:

    http://www.th7.cn/Program/Android/201509/572743.shtml

这里要注意的是:

在AndroidStudio开发ndk目前Androidstudio对与ndk开发来说还不是太稳定,最好不要用最新的android-ndk-rX开发工具包

这里简单说一下我的第一个AndroidStudio的项目流程:

  • NDK接口、
public class NdkJniUtils {    static {        System.loadLibrary("myJniApp");      }    public native String getCLanguageString();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 二、

创建jni文件边

  • 三 、利用JavaH生成.h
D:\project\ndk\MyApplication2\app\build\intermediates\classes\debug>javah cold.yyh.com.myndk01.NdkJniUtils
  • 1
  • 四、编写C代码 
    利用生成的.h文件将其中的关键代码copy到.c文件夹中去
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class cold_yyh_com_myndk01_NdkJniUtils */#ifndef _Included_cold_yyh_com_myndk01_NdkJniUtils#define _Included_cold_yyh_com_myndk01_NdkJniUtils#ifdef __cplusplusextern "C" {#endif/* * Class:     cold_yyh_com_myndk01_NdkJniUtils * Method:    getCLanguageString * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_cold_yyh_com_myndk01_NdkJniUtils_getCLanguageString  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

C代码中:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>JNIEXPORT jstring JNICALL Java_cold_yyh_com_myndk01_NdkJniUtils_getCLanguageString (JNIEnv * env, jobject obj){  return (*env)->NewStringUTF(env,"你好,ndk,我来了");}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 五、创建Android.mk和Application.mk文件

    注意这里亲测过,没有Android.mk文件和Application.mk文件也可以的 
    这里为了避免错误还是按照正确的开发步骤进行编写

  • 六build.gradle相关配置 
    在Android{}中添加
 ndk{            moduleName "myJniApp" //生成的so名字            ldLibs "log" //Log打印            abiFilters "armeabi", "armeabi-v7a", "x86"    //输出指定三种abi体系结构下的so库。目前可有可无。        }
  • 1
  • 2
  • 3
  • 4
  • 5
externalNativeBuild{        ndkBuild{            path "src/main/jni/Android.mk"        }    }
  • 1
  • 2
  • 3
  • 4
  • 5
 sourceSets.main {        jni.srcDirs = []        jniLibs.srcDir 'src/main/libs'    }
  • 1
  • 2
  • 3
  • 4
  • 最后build工程生成.so文件

    build——>Rebuild Model App 或者 make project

*注意* 
最后竟然没发现.so文件在哪里,但项目依然编译成功,并且正常运行正确调到C中的方法。

其中.so文件会出现在你的app下的build下intermediates项目文件里面,只需要将其拷贝到里面即可。

但事实发现ndk版本越高的话,竟然仍然 在其下面找不到.so文件。应该说是一个AndroidStudio还不太成熟。这里留着以后在研究。

原创粉丝点击