当前位置:操作系统 > 安卓/Android >>

android之搭建JNI开发环境及简单案例

项目名:HelloFromC
一、在开始jni编程之前对我们使用的环境进行如下配置:(在windows环境下)
1、下载android-ndk-r7b,解压放在C:\android-ndk-r7b目录下。(方便输入命令,也可以自定目录)
2、下载cygwin。
   安装的时候,最高版本进行安装。
3、配置NDK的 cygwin环境变量
为了方便直接在命令行里面使用ndk-build
需要给cygwin的环境变量里面添加ndk的目录
目录/etc/profile/

4、运行cygwin。(可输入如下命令:make -v ,gcc -v)
输入make -v
显示出来 GNU Make 的版本 ,说明我们的cygwin模拟的linux编译环境 模拟成功了.

二、为eclipse增加c和c++的开发插件 CDT插件
Help中的install new software
选择 Helios- http://download.eclipse.org/release/helios
等待展开,选择Programing language
选择c/c++ 开发工具
一路next下去。
同意licenses
安装成功会提示是不是确认重启eclipse,重启就完成安装。

三、JNI简单案例:
Java代码调用一个C方法打印HelloFromC

MainActivity:
package com.csdn.hello;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
   
    static{
        System.loadLibrary("Hello");//加载
    }
   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
   
    public native String helloFromC();
    public native String hello_from_c();
   
   
    public void onClick(View view){
        String result= helloFromC();
        Toast.makeText(this,result , 0).show();
    }
   

}

main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:onClick="onClick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="HelloFromC" />

   
</LinearLayout>
cmd 进入eclipse中安卓工程HelloFromC的目录:
D:\WorkSpace\HelloFromC\bin\classes
输入: javah com.csdn.hello,MainActivity
生成该文件对应的头文件:com_csdn_hello_MainActivity.h
在HelloFromC根目录下建立名为jni的文件夹;
将其复制到该目录下;
com_csdn_hello_MainActivity.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_itheima_hello2_MainActivity */

#ifndef _Included_com_itheima_hello2_MainActivity
#define _Included_com_itheima_hello2_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_itheima_hello2_MainActivity
 * Method:    helloFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_csdn_hello_MainActivity_helloFromC
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

jni目录下加入Android.mk文件:
   #local_path 代表的是当前android.mk文件所在的路径
   #$() 代表的是一个函数.
   LOCAL_PATH := $(call my-dir)

  #CLEAR_VARS 清空变量
  # 清空所有以LOCAL_ 开头的变量里面的内容 (不会清空LOCAL_PATH里面的数据);
   include $(CLEAR_VARS)

 # 定义编译后的 c代码库 的名称.
   LOCAL_MODULE    := Hello
  #定义makefile 编译的源文件
  #依赖的头文件 是不需要指定的.
   LOCAL_SRC_FILES := Hello.c

   #生成一个动态的代码库
   include $(BUILD_SHARED_LIBRARY)
   # include $(BUILD_STATIC_LIBRARY); 生成一个静态的代码库
   # 静态代码库的作用 主要就是用来提供一些库函数 编译的时候 可能需要用到静态代码库.
  

并编写Hello.c文件:
#include "com_csdn_hello_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_csdn_hello_MainActivity_helloFromC
  (JNIEnv * env, jobject obj){
   return (*env)->NewStringUTF(env,"Hello From C");
 }

打开cygwin
输入 cd..
cd ..
切换到linux根目录下
然后进入到应用程序目录
cd cydrive/d/WorkSpace/HelloFromc
ndk-build 进行编译,生成动态库:
在D:\WorkSpace\HelloFromC2\obj\local\armeabi下会自动生成
libHello.so文件

最后在如上的MainActivity中的static代码块中加载动态库,即Android.mk中LOCAL_MODULE    := Hello 变量的值
然后部署应用程序,点击按钮即可利用土司打印出结果 HelloFromC

作者:zljpp
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,