Eclipse Android NDK 开发
下载NDK
由于Google被屏蔽,android官网也被屏蔽了,推荐去这个地址去下载,关于android开发的内容全都有
下载完之后配置NDK环境,详细就不说了,以上网址也有相关步骤,也可以问度娘和股沟
在eclipse中新建工程
创建成功后
建立用于jni映射的java文件
HelloUtils.java
package com.example.jnitest;
public class HelloUtils {
static{
System.loadLibrary("hello");
}
public native static String toastHello();
public native static void logHello();
}
MainActivity.java
package com.example.jnitest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener{
private Button btnf;
private Button btns;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView(){
btnf=(Button) findViewById(R.id.btn_first);
btns=(Button) findViewById(R.id.btn_second);
btnf.setOnClickListener(this);
btns.setOnClickListener(this);
}
private void initData(){
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_first:
toastHello();
break;
case R.id.btn_second:
logHello();
break;
default:
break;
}
}
private void toastHello(){
Toast.makeText(this, HelloUtils.toastHello(), Toast.LENGTH_SHORT).show();
}
private void logHello(){
HelloUtils.logHello();
}
}
布局文件 activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_first"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="say hello world"/>
<Button
android:id="@+id/btn_second"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="log hello world"/>
</LinearLayout>
创建完毕后,编译一下项目,生成了class文件
生成相关的头文件
打开cmd 进入到项目的classes文件夹下
使用javah工具生成头文件
javah com.example.jnitest.HelloUtils
生成了相关的头文件
新建jni文件夹用来存放ndk开发相关代码
将上一步产生的com_example_jnitest_HelloUtils.h
文件移动到jni文件夹下
为了方便将其重命名为HelloUtils.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jnitest_HelloUtils */
#ifndef _Included_com_example_jnitest_HelloUtils
#define _Included_com_example_jnitest_HelloUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jnitest_HelloUtils
* Method: toastHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_jnitest_HelloUtils_toastHello
(JNIEnv *, jclass);
/*
* Class: com_example_jnitest_HelloUtils
* Method: logHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_jnitest_HelloUtils_logHello
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
将其copy一份重命名为HelloUtils.cpp
文件放在jni
文件夹下
并修改如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include "android/log.h"
#include "HelloUtils.h"
#define LOG_TAG "HelloUtils"
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jnidemo_HelloUtils
* Method: toastHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_jnidemo_HelloUtils_toastHello
(JNIEnv *env, jclass){
char* tmpstr = "hello world";
return env->NewStringUTF(tmpstr);
};
/*
* Class: com_example_jnidemo_HelloUtils
* Method: logHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_jnidemo_HelloUtils_logHello
(JNIEnv *, jclass){
LOGD("hello world!");
};
#ifdef __cplusplus
}
#endif
创建Android.mk文件和Application.mk文件
相关文件的意义和变量的意义,书写方式,可以去Android官网NDK开发部分查看
具体文件如下:
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=hello
LOCAL_LDLIBS:=-llog
LOCAL_SRC_FILES := HelloUtils.cpp
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM :=android-14
对项目添加C++支持
右键项目—-》》new—-》》other
完成之后
修改编译配置
配置完成后,运行项目OK
如果打开代码出现代码审查问题,参考本人以前的文章
Android OpenCV NDK 配置问题