您的位置:首页 > 编程语言 > Java开发

android eclipse ndk使用记录

2015-10-05 12:05 621 查看
为方便开发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:\workspace\prebuild\android-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);

public class MainActivity extends Activity {

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

private native String printJNI(String inputStr);

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("TAG", printJNI("test"));
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

23 }


4. 打开命令行,进入到classes目录:d:\workspace\Android\ndktest\bin\classes

执行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

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_ndktest_MainActivity */

#ifndef _Included_com_example_ndktest_MainActivity
#define _Included_com_example_ndktest_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_example_ndktest_MainActivity
* Method:    printJNI
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_ndktest_MainActivity_printJNI
(JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#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

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := ndktest
LOCAL_SRC_FILES := ndktest.cpp

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文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: