• android eclipse ndk使用记录


    为方便开发jni程序,android提供了ndk包来简化开发过程,避免开发人员下载完整的平台代码,并且可以在windows环境下集成到eclipse里面,大大加快了开发速度。这里记录下一个简单例子。

    ADT开发环境:adt-bundle-windows-x86-20140702 Version 23.0.2

    NDK的开发包:android-ndk-r10d

    NDK的eclipse插件:com.android.ide.eclipse.ndk_23.0.2.1259578.jar 保存到eclipse/plugins/目录下面

    重新打开eclipse,在Window -> Perferences -> Android下面会出现NDK的选项,在NDK Location里面选择android-ndk-r10d

    的路径位置,如:D:workspaceprebuildandroid-ndk-r10d。 Apply之后按OK退出。

    准备工作完成之后,开始新建工程。

    1. 新建一个android工程,如ndktest,com.example.ndktest

    2. 然后右键 -> Android Tools -> Add Native Support,在弹出的对话框里面填入jni共享库的名称,如:libndktest.so,点击确定之后eclipse会自动生成一个jni目录,并在该目录生成一个Android.mk和一个ndktest.cpp文件。

    3. 编辑Activity类,添加jni函数的声明,新增加载动态库函数System.loadLibrary和一个JNI函数的声明

    private native String printJNI(String inputStr);

     1 public class MainActivity extends Activity {
     2 
     3     static {
     4         System.loadLibrary("ndktest");
     5     }
     6     
     7     private native String printJNI(String inputStr);
     8     
     9     @Override
    10     protected void onCreate(Bundle savedInstanceState) {
    11         super.onCreate(savedInstanceState);
    12         setContentView(R.layout.activity_main);
    13         Log.d("TAG", printJNI("test"));
    14     }
    15 
    16     @Override
    17     public boolean onCreateOptionsMenu(Menu menu) {
    18         // Inflate the menu; this adds items to the action bar if it is present.
    19         getMenuInflater().inflate(R.menu.main, menu);
    20         return true;
    21     }
    22 
    23 }

    4. 打开命令行,进入到classes目录:d:workspaceAndroid dktestinclasses

    执行javah com.example.ndktest.ManActivity, 之后会自动生成一个符合jni规范的头文件:

    com_example_ndktest_MainActivity.h

    5. 拷贝com_example_ndktest_MainActivity.h到jni目录下,在ndktest.cpp里面包含该头文件

    com_example_ndktest_MainActivity.h

     1 /* DO NOT EDIT THIS FILE - it is machine generated */
     2 #include <jni.h>
     3 /* Header for class com_example_ndktest_MainActivity */
     4 
     5 #ifndef _Included_com_example_ndktest_MainActivity
     6 #define _Included_com_example_ndktest_MainActivity
     7 #ifdef __cplusplus
     8 extern "C" {
     9 #endif
    10 /*
    11  * Class:     com_example_ndktest_MainActivity
    12  * Method:    printJNI
    13  * Signature: (Ljava/lang/String;)Ljava/lang/String;
    14  */
    15 JNIEXPORT jstring JNICALL Java_com_example_ndktest_MainActivity_printJNI
    16   (JNIEnv *, jobject, jstring);
    17 
    18 #ifdef __cplusplus
    19 }
    20 #endif
    21 #endif

    ndktest.cpp

    #include <jni.h>
    #include <string.h>
    
    #include "com_example_ndktest_MainActivity.h"
    
    JNIEXPORT jstring JNICALL Java_com_example_ndktest_MainActivity_printJNI
                          (JNIEnv *env, jobject thiz, jstring str)
    {
        return env->NewStringUTF("Hello from JNI from bear !");
    }

    Android.mk

    1 LOCAL_PATH := $(call my-dir)
    2 
    3 include $(CLEAR_VARS)
    4 
    5 LOCAL_MODULE    := ndktest
    6 LOCAL_SRC_FILES := ndktest.cpp
    7 
    8 include $(BUILD_SHARED_LIBRARY)

    6. 最后clean一下工程,自动编译,eclipse会调用ndk去编译生成最终的动态库文件,如libndktest.so,并自动打包到

    apk里面。

    7. 安装生成的apk,可以在logcat里面看到来自jni的log内容。观察app的安装目录,可以发现最终生成的so库文件是存放在了

    root@degasveltechn:/data/data/com.example.ndktest #ll

    drwxrwx--x u0_a146  u0_a146           2015-10-04 20:57 cache
    lrwxrwxrwx install  install           2015-10-04 20:59 lib -> /data/app-lib/com.example.ndktest-2

    库是统一安装到/data/app-lib目录下面的,/data/data/app-name下放的是一个link文件。

  • 相关阅读:
    三菱Q系列PLC MC协议通讯
    相机常用属性配置简介[转]---Labview IMAQ 修改相机曝光等参数的方法
    数码显微镜的实际放大倍数的正确计算方法【转载】
    VS2012 C# 配置log4net
    CHM格式帮助文档无法打开的问题
    win10 下安装win7虚拟机
    杂记:使用RawCap和Wireshark对 127.0.0.1或localhost 进行抓包
    杂记:01
    linux应用编程一:文件IO和目录操作
    QTableWidget常用函数及注意事项
  • 原文地址:https://www.cnblogs.com/scnutiger/p/4855554.html
Copyright © 2020-2023  润新知