zoukankan      html  css  js  c++  java
  • jni入门 eclipsecygwin+ndk

    声明:本文转载自http://blog.sina.com.cn/s/blog_7aa2703601010jrx.html

    一、安装CDT、NDK

    CDT是一个在Eclipse下可以搞C++代码的插件。NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so 和java 应用一起打包成apk。怎么在eclipse装这两个我就不多说了。大家按照以前装adt和sdk的方法来搞就好了。不过有一点是要注意的:因为cygwin是在window上模拟linux的控制台环境,所以对于访问文件的路径是不能带有空格的,貌似也不能带中文。所以ndk的解压后存放的路径必须不能包括空格或中文,比如这种“D:\Program Files\android-ndk-windows”在cygwin是不能识别成功的。

    二、安装cygwin

       然后是cygwin,我给大家发的那个cygwin压缩包是有安装说明的,大家按照说明一步一步来就可以安装成功。

    三、配置NDK环境变量

        上述三样安装成功后,就是配置NDK环境变量的问题了。

         1、  首先找到cygwin的安装目录,找到一个home\<你的用户名>\.bash_profile文件,我的是:E:\cygwin\home\Administrator\.bash_profile。(注意:我安装的时候我的home文件夹下面神马都没有,解决 的办法:首先打开环境变量,把里面的用户变量中的HOME变量删掉,在E:\cygwin\home文件夹下建立名为Administrator的文件夹(是用户名),然后把E:\cygwin\etc\skel\.bash_profile拷贝到该文件夹下)。

         2、  打开bash_profile文件,(此处必须要使用UltraEdit文件编辑器打开,并且打开后不要转换格式!使用其他编辑工具打开的话编辑后是乱码,不能执行!)添加NDK=/cygdrive/<你的盘符>/<android ndk 目录> 例  如:

    NDK=/cygdrive/e/android-ndk-r5

    export NDK

    NDK这个名字是随便取的,为了方面以后使用方便,选个简短的名字,然后保存

         3、打开cygwin,输入cd $NDK,如果输出上面配置的/cygdrive/e/android-ndk-r5信息(输出的信息为ndk的安装目录),则表明环境变量设置成功了。

     

    四:用NDK来编译程序

    1、现在用安装好的NDK来编译一个简单的程序。在NDK的安装目录下新建一个apps目录存放工程。在apps目录下新建一个myjni目录。打开eclipse,新建一个android工程,新建工程时需要取消复选框“Use default location”,并指定预先建立的myjni文件夹作为工程文件夹。

    2、在eclipse里编写Jnitest.java文件:

    package minQ.android;

     

    import android.app.Activity;

    import android.os.Bundle;

    import android.widget.TextView;

     

    public class Jnitest extends Activity {

     

    private TextView tvTextView;

    public native String speak();//声明共享库的函数,不需要在java里实现

    String string;

    static{

    System.loadLibrary("myjni");//动态加载共享库

    }

    public void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    string = speak();

    tvTextView = (TextView)findViewById(R.id.myTextView01);

    tvTextView.setText(string);

    }

    }

     

    说明:

    程序开始运行的时候会加载myjni, static区声明的代码会先于onCreate方法执行。如果你的程序中有多个类,而且如果myjni这个类不是你应用程序的入口,那么myjni(完整的名字是libmyjni.so)这个库会在第一次使用myjni这个类的时候加载。

     

    3、应用此java文件生成.h文件。使用windows cmd控制台进入到工程目录下的bin目录,输入命令:

    其中-classpath表示类的路径bin;

    -d jni表示生成的文件存放的路径

    minQ.Android.Jnitest表示类的完整路径。

    生成的.h头文件将会放在bin\jni目录下。

     

    4、在工程目录下建立Application.mk文件:

     

    APP_PROJECT_PATH:=$(call my-dir)

    APP_MODULES :=myjni

    说明:在进行NDK开发时,在应用程序目录中一定要有Application。mk文件。用来声明Android工程需要调用的非托管模块(如静态库或共享库)第一行变量APP_PROJECT_PATH表示Android工程所在的目录。在生产共享库文件后,apk将自动将共享库文件拷贝到Android工程\libs\armeabi目录中。第二行变量APP_MODULES表示Android工程需要调用的非托管模块。

     

    5、接下来在工程目录下新建jni目录,把bin\jni目录下的.h头文件移动到此目录下,并且在目录下编写minQ_android_Jnitest.c文件和Android.mk文件。

    minQ_android_Jnitest.c文件内容:

     

    #include<stdlib.h>

    #include<stdio.h>

    #include"minQ_android_Jnitest.h"//include刚才生成的头文件

     

    jstring Java_minQ_android_Jnitest_speak(JNIEnv* env, jobject this){

    return (*env)->NewStringUTF(env,"This is the first NDK program!");

    }

    说明:jstring表示Java字符串,Java_minQ_android_Jnitest_speak的构成为Java_<包名称>_<类>_<函数>,其中<函数>的名称和参数要与Jnitest.java文件定义的函数一致。

     

    Android.mk文件内容:

     

    LOCAL_PATH :=$(call my-dir)

     

    include $(CLEAR_VARS)

     

    LOCAL_MODULE :=myjni

    LOCAL_SRC_FILES :=minQ_android_Jnitest.c

     

    include $(BUILD_SHARED_LIBRARY)

     

    说明:LOCAL_PATH := $(call my-dir) 一个Android.mk 文件首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

    include $( CLEAR_VARS) CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
    LOCAL_MODULE := myjni编译的目标对象,LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。
    注意:编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'myjni'的共享库模块,将会生成'libmyjni.so'文件。
    重要注意事项:
    如果你把库命名为‘libmyjni’,编译系统将不会添加任何的lib前缀,也会生成 'libmyjni.so',这是为了支持来源于Android平台的源代码的Android.mk文件,如果你确实需要这么做的话。
    LOCAL_SRC_FILES := myjni.c LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
    注意,默认的C++源码文件的扩展名是’.cpp’. 指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是’.cxx’,而不是’cxx’)
    include $(BUILD_SHARED_LIBRARY)  BUILD_SHARED_LIBRARY表示编译生成共享库,是编译系统提供的变量,指向一个GNU Makefile脚本,负责收集自从上次调用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。还有 BUILD_STATIC_LIBRARY变量表示生成静态库:lib$(LOCAL_MODULE).a, BUILD_EXECUTABLE 表示生成可执行文件。

    完成到这里,jni目录下就有三个文件:

     

     

    6、此时我们可以启动cygwin编译我们的工程。myjni是apps目录下的应用程序目录名称。在指定应用程序(目录)名称后,NKD编译系统会首先找到目录中的Application.mk文件,根据Application.mk文件的信息,确定该Android共享需要使用的APP_MODULES模块;然后在jni目录中搜索所有Android.mk文件,在找到与APP_MODULES模块匹配的Android.mk文件后,根据Android.mk文件提供的信息编译指定的C/C++源代码文件,形成共享库文件;最后将生产的共享库文件拷贝到Android工程的指定目录中。

     

     

    说明:启动cygwin后,直接输入命令cd $NDK可以进入ndk安装目录,然后进入myjni工程目录,输入命令$NDK/ndk-build (以上说用的$NDK对应于你在安装cygwin时操作bash_profile文件在后面添加的名称一样,见三.2步)。

     

    7、打开工程myjni目录,会发现在该目录下自动生成两个文件:libs和obj。生成的.so文件在libs\armeabi目录下。在eclipse下刷新工程,重新编译生成apk,libhello-jni.so共享库会一起打包在apk文件内。然后可以顺利地运行你的第一个NDK程序了! 

  • 相关阅读:
    Android AHandle AMessage
    android java 与C 通过 JNI双向通信
    android 系统给应用的jar
    UE4 unreliable 同步问题
    UE4 difference between servertravel and openlevel(多人游戏的关卡切换)
    UE4 Run On owing Client解析(RPC测试)
    UE4 TSubclassOf VS Native Pointer
    UE4 内容示例网络同步Learn
    UE4 多人FPS VR游戏制作笔记
    UE4 分层材质 Layerd Materials
  • 原文地址:https://www.cnblogs.com/wyqfighting/p/2810944.html
Copyright © 2011-2022 走看看