文中对应的软件资源下载地址:http://download.csdn.net/detail/u010857510/9646241,里面包括博文里介绍的所有Android代码,欢迎下载,包括jni文件夹下的Android.mk、MyString.c、MyString.h文件,libpandasince.so文件,mydemo.apk,mydemo安卓项目代码工程,资源截图如下:
Android NDK的开发,首先先介绍所涉及的相关概念
1、jni简介
JNI全称为Java NativeInterface(JAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互。并非从Android发布才引入JNI的概念的。
2、NDK简介
简单来说,Android的NDK提供了一些交叉编译工具链和Android自带的库,这些Android的库可以让开发者在编写本地语言的程序时调用。而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库。
笔者是在Ubuntu环境下进行的编译,Windows环境下也可以进行编译。
以下部分为代码,可从文中所附地址下载相关代码:
1、jni
Android.mk文件代码如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := pandasince
LOCAL_SRC_FILES := MyString.c
LOCAL_LDLIBS += -llog
LOCAL_LDLIBS +=-lm
include $(BUILD_SHARED_LIBRARY)
MyString.c文件代码如下:
#include <jni.h>
#include <android/log.h>
#include "MyString.h"
/*
* Class: com_panda_since_MyString
* Method: getstring
* Signature: ()I
*/
JNIEXPORT jstring JNICALL Java_com_panda_since_MyString_getstring
(JNIEnv *env, jobject obj)
{
jstring mstring="你获取的是一个字符串";
__android_log_print(ANDROID_LOG_INFO, "demo", "getstring");
__android_log_print(ANDROID_LOG_INFO, "demo", "mstring is :%s",mstring);
return (*env)->NewStringUTF(env, mstring);
}
MyString.h文件代码如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <string.h>
#include <jni.h>
/* Header for class com_neojet_scanner_key */
#ifndef _Included_com_panda_since_MyString
#define _Included_com_panda_since_MyString
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_panda_since_MyString
* Method: getstring
* Signature: ()I
*/
JNIEXPORT jstring JNICALL Java_com_panda_since_MyString_getstring
(JNIEnv *env, jobject obj);
#ifdef __cplusplus
}
#endif
#endif
编译环境是Ubuntu,截图如下:
生成的so文件在libs/armeabi/目录下,这个so文件就是安卓要调用的文件,截图如下:
2、Android工程
上一步操作得到的so文件放在了工程的libs目录下,工程截图如下:
MyString.java文件
package com.panda.since;
/**
* Android NDK
* 创建时间: 2016-10-6 上午9:51:49
* 创 建 者 : Since
* 联系方式: 2586339607@qq.com
*/
public class MyString {
public native Stringgetstring();
static {
System.loadLibrary("pandasince");
}
}
MainActivity.java文件
package com.panda.since;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
/**
*
* 创建时间: 2016-10-6 上午9:52:35
* 创 建 者 : Since
* 联系方式: 2586339607@qq.com
*/
public class MainActivity extends Activity {
private Button btn_get;
private TextView tv;
private MyString mString = new MyString();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mystring);
btn_get = (Button)findViewById(R.id.btn_get);
tv = (TextView)findViewById(R.id.tv);
//按键的监听事件
btn_get.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String s = mString.getstring();
Log.i("demo", "btn_get"+s);
tv.setText(s);
}
});
}
}
activity_mystring.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""/>
<Button
android:id="@+id/btn_get"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取" />
</LinearLayout>
编译运行,在安卓真机上的效果图如下:
未完待续……后期还会更新Android NDK开发(下)
喜欢嵌入式开发的同学欢迎加入 since 嵌入式交流群1:924412015