Android NDK开发(上)---jni的编译和调用so静态库文件

文中对应的软件资源下载地址: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 NativeInterfaceJAVA本地调用)。从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互。并非从Android发布才引入JNI的概念的。

2、NDK简介

 

       简单来说,AndroidNDK提供了一些交叉编译工具链和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

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值