zoukankan      html  css  js  c++  java
  • 文件方法Android NDK开发的环境配置和使用

    本文朋友在深圳吃饭的时候突然想到的...近期就有想写几篇关于文件方法的笔记,所以回家到之后就奋笔疾书的写出来发布了

        安装步调:

        1.安装ADT,其中的NDK也要安装;

        2.下载对应本版的NDK,解压到对应录目下;

        3.进入eclipse-->window-->preference-->Android-->NDK下,把路径设置到面上解压的录目下。

        配置步调:

        1.新建Android项目,然后在项目上右键,选择Android Tools-->Add Native Support。这时,NDK工具会主动为你生成jni录目和××.cpp文件和Android.mk文件,libs/armeabi录目。

        文件和方法

        2.编写应相的Java类,然后添加native方法。(见面下码代)

        3.你可以选择着控制台下进入到bin/classes录目下应用

    javah -v -jni -classpath . -d http://www.cnblogs.com/jni/ Java类

        命令来生成对应 的头文件。但是每次这样做总觉感太烦麻,还是应用主动化工具比较好。在eclipse当选择配置外部工具,然后填入以下内容:

        文件和方法

        

        4.配置功成后译编下工程,然后就会主动生成对应的.so文件。

        5.在要需应用native方法的类中创立native方法类的例实对象,然后对方法行进用引便可。(见面下码代)

        

        小例子:

        1.将字符串入写sd卡录目下的文件中

        2.将sd卡录目下文件中的字符串读取出来

    /** Author:wenix
     * Date:2013-5-9
     * File Name:MainActivity.java
     */
    package com.wenix.webcam;
    
    import java.io.IOException;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Environment;
    import android.view.Menu;
    import android.widget.TextView;
    
    
    public class MainActivity extends Activity {
    	private TextView tv;
    	static{
    		System.loadLibrary("AndroidWebCam");//载加so库,不要加lib前缀和.so缀后
    	}
    	private String sdcardPath;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		try {
    			sdcardPath = Environment.getExternalStorageDirectory().getCanonicalPath();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		tv = (TextView)findViewById(R.id.tv);
    		NativeFileUtils nfu = new NativeFileUtils();
    		nfu.writeString2File("我是中国人,我爱中国", sdcardPath+"/hello.txt");
    		String info = nfu.readStringFromFile(sdcardPath+"/hello.txt");
    		tv.setText(info);
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    }

        含有本地方法的类:

    package com.wenix.webcam;
    
    public class NativeFileUtils {
    	public native void writeString2File(String info, String filePath);
    	public native String readStringFromFile(String filePath);
    }

        c码代:

        每日一道理
    正所谓“学海无涯”。我们正像一群群鱼儿在茫茫的知识之海中跳跃、 嬉戏,在知识之海中出生、成长、生活。我们离不开这维持生活的“海水”,如果跳出这个“海洋”,到“陆地”上去生活,我们就会被无情的“太阳”晒死。
    #include <jni.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <android/log.h>
    #include "com_wenix_webcam_NativeFileUtils.h"
    
    #define LOG_V(TAG, LOG) (__android_log_print(ANDROID_LOG_VERBOSE, TAG, LOG))
    
    JNIEXPORT void JNICALL Java_com_wenix_webcam_NativeFileUtils_writeString2File
      (JNIEnv * env, jobject object, jstring info, jstring filePath){
    	const char* chFilePath = env->GetStringUTFChars(filePath, 0);
    	FILE* fp = fopen(chFilePath, "w+");
    	env->ReleaseStringUTFChars(filePath, chFilePath);
    	const char* chInfo = env->GetStringUTFChars(info, 0);
    	fputs(chInfo,fp);
    	env->ReleaseStringUTFChars(info, chInfo);
    	fclose(fp);
    }
    
    JNIEXPORT jstring JNICALL Java_com_wenix_webcam_NativeFileUtils_readStringFromFile
      (JNIEnv * env, jobject object, jstring filePath){
    	const char* chFilePath = env->GetStringUTFChars(filePath, 0);
    	FILE* fp = fopen(chFilePath, "r");
    	env->ReleaseStringUTFChars(filePath, chFilePath);
    	char chContent[128];
    	fgets(chContent, 128, fp);
    	char* log = (char*)malloc(13*sizeof(char));
    	snprintf(log, sizeof(chContent), "size=%d,conent=%s", sizeof(chContent),chContent);
    	LOG_V("1",log);
    	jstring ret = env->NewStringUTF(chContent);
    	return ret;
    }

        Android.mk文件

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := AndroidWebCam
    LOCAL_SRC_FILES := AndroidWebCam.cpp
    LOCAL_LDLIBS := -llog #log所需库,一定要加上,否则没法通过译编
    
    include $(BUILD_SHARED_LIBRARY)

        记着要中AndroidManifest.xml文件中加上权限,否则没法写读文件

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

        运行,效果如下图:

        文件和方法

        示例总结:

        1.字符串在Linux平台上来本就是UTF-8码编,Java默许也是UTF-8码编,所以没有要须行进码编和解码的进程。
    2.由于c/c++中没有String数据类型,所以jstring和char*之间的转化很有要须,JNI供提了换转的方法--env->GetStringUTFChars(jstring, jboolean*),但是记得用完后要应用
    env->ReleaseStringUTFChars(jstring, const char*);释放掉(C/C++中内存的管理是很要须的,跟Java主动内存收回不同,特别要注意)
    3.c/c++中如何把char*类型换转为基本数据类型?c/c++供提了应相的方法,在stdlib.h头文件中,有atoi,atol,atoll等数函。
    4.c/c++中如何把基本类型换转为char*类型?我没有找到itoa,ltoa等方法,所以应用了sprinf或者snprintf方法来行进换转,也很便利。

        5.即使是c/c++编写的码代也没法绕过权限检查,必要须请求应相的权限,否则没法成完应相的作操。

    文章结束给大家分享下程序员的一些笑话语录: IBM和波音777
      波音777是有史以来第一架完全在电脑虚拟现实中设计制造的飞机,所用的设备完全由IBM公司所提供。试飞前,波音公司的总裁非常热情的邀请IBM的技术主管去参加试飞,可那位主管却说道:“啊,非常荣幸,可惜那天是我妻子的生日,So..”..
      波音公司的总载一听就生气了:“胆小鬼,我还没告诉你试飞的日期呢!”

  • 相关阅读:
    Docker-Compose搭建单体SkyWalking 6.2
    Docker搭建MySQL主从集群,基于GTID
    【简记】修改Docker数据目录位置,包含镜像位置
    【拆分版】Docker-compose构建Kibana单实例,基于7.1.0
    【拆分版】Docker-compose构建Logstash多实例,基于7.1.0
    【拆分版】Docker-compose构建Zookeeper集群管理Kafka集群
    命令行模式和python交互模式
    详解 HTTPS、TLS、SSL、HTTP区别和关系
    windows下如何查看进程、端口占用、杀死进程教程
    pycharm最常用的快捷键总结
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3069935.html
Copyright © 2011-2022 走看看