• jni 入门 android的C编程之旅 --->环境搭建&&helloworld


    需要进行jni的开发有一下几个条件:

    1:能初步使用C/C++如果不会,请参读 谭浩强的  C编程语言

    2:android应用开发已经基本入门,如果没有,请先行学习


    这两个条件基本满足后,我们开始了:

    1:环境搭建

    相信大家android开发环境是有的哦

    A:给eclipse添加 C/C++文件。在 eclipse的help的install new software

    B:由于我是windows平台的环境(所以需要安装一个  Cygwin 这个是来模拟我们的linux操作系统的,因为android底层就是一个linux操作系统)

    C:安装ndk(ndk是用来跨平台编译的    如果你C学的比较好的话,你会了解:在windows下编译的C代码是无法给java调用的,也无法放到linux系统使用(跨平台性不如java))


    这仨就自己百度一步一步搭建吧,由于比较大,我这放哪也不清楚,有机会我会把这些打包放到  网盘供大家下载的,现在大家还是先到其他地方找找教程,搭建一下环境,如果是从网络下载顺利的话,这个安装过程可能需要1-2天


    环境搭建完成了,接下来我们就写一个helloworld吧:


    看一下目录结构:比我们正常的android应用多了一个  jni目录

    我们在里面写了简单的几行c代码:

    Hello.c

    #include <stdio.h>
    #include <jni.h>
    
    jstring Java_com_test_ndk1_MainActivity_helloFromJNI(JNIEnv* env, jobject obj){
    
    	//输出一个java字符串
    	//返回一个java字符串
    	//jstring     (*NewStringUTF)(JNIEnv*, const char*);
    	char* cstr = "helloFromJNI";
    
    	return (**env).NewStringUTF(env, cstr);
    
    }
    

    注意,这个C可能和我们传统的C编程不太一样,后面我会详细分解这个C怎么写的。

    然后,我们在我们的android的项目中去调它


    编写  Android.mk

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := Hello
    LOCAL_SRC_FILES := Hello.c
    
    include $(BUILD_SHARED_LIBRARY)


    这个相当于一个跨平台的make,熟悉linux的朋友一定知道 linux下的makefile这个玩意儿,不知道也就先不管了,后面会详细解释,这儿就先不说了


    MainActivity

    package com.test.ndk1;
    
    import com.test.ndk1.R;
    
    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");
    	}
    	
    	//本地方法  由C实现
    	public native String helloFromJNI();
    	
    	
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        
        
        public void click(View view){
        	//调用c代码
        	Toast.makeText(this, helloFromJNI(), 0).show();
        }
    


    简单的,点击一个按钮,弹出一个土司,土司内容是  C中的 helloFromJNI() 函数(C中我们通常说一个方法是函数,同一个概念)的返回值

    然后,很简单的布局文件:activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:text="调用C代码"
            android:onClick="click"/>
    
    </RelativeLayout>
    


    ok,项目写完了,接下来的工作是编译

    打开cygwin,进入到工程的jni目录下(linux如何进入一个目录,自己稍微看下,和windows基本差不多,如果是要cygwin切换到C盘以外的目录,那就先到根目录,里面有个cygdrive的目录,里面的d e f等就对应你的 D E F盘

    执行  ndk-build

    编译成功:


    刷新一下工程,可以看到一个obj目录:



    然后ndk又帮我们将 libHello.so自动封装到了 libs目录下,自己可以打开看下哦,我就不上图了


    运行程序:



    ok了,第一个helloworld到此结束,后面我会陆续分享一些原理性的东东给大家哦





  • 相关阅读:
    青少年机器人技术等级考试实际操作试卷(三级)201812 new
    SQL预编译 new
    青少年机器人技术等级考试实际操作试卷(三级)201809 new
    青少年机器人技术等级考试实际操作试卷(三级)201803 new
    SQL基本练习 new
    Asp.Net MVC 自定义一个ActionResult用于AJAX交互
    使用 TeamLab 来协同和管理工作
    使用Chose来美化Select
    在Asp.Net下使用couchbase实现分布式缓存
    如何修改couchbase的RAM
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3243914.html
Copyright © 2020-2023  润新知