• Android JNI的第一步——从HelloWorld开始


    第一步:配置NDK运行环境

    两个工具包:

    com.android.ide.eclipse.ndk_23.0.2.1259578.jar

    android-ndk-r10(当然也可以是一些其他类似的工具包,如android-ndk-r8)

    前者为搭建NDK环境时,必需的工具包。需要将其置于eclipse的plugins文件夹中。然后重启eclipse即可。

    前者工具包下载连接

    后者为eclipse运行JNI程序所需要的工具包,将其置于一个你习惯的路径下。放置好之后,进行环境变量的配置,如下图:



    添加NDK路径:

    在window工具栏中选择preferences选项进入Preferences对话框,如下:


    上面所说的第一个工具包就是为产生上图中的3“NDK”的,如果不出意外,添加完第一个工具包后就会有这个选项了。然后上图中的第4步就是去添加我们的第二个工具包。

    经过上面的步骤,我们的开发环境已经搭建完成了。


    第二步:创建Android工程

    新建Android工程:

    新建项目和普通Android工程没什么不同。


    添加本地支持:

    新建好工程之后,我们就需要对其进行添加本地支持


    此步操作完成之后,会自动生成Android.mk配置文件和相应的cpp文件,mk文件内容:

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := William_Hello_JNI
    LOCAL_SRC_FILES := William_Hello_JNI.cpp
    
    include $(BUILD_SHARED_LIBRARY)
    
    而对于那个LOCAL_MODULE    := William_Hello_JNI中的William_Hello_JNI则是在Java代码中需要去调用的Library,后面会有说明。

    当然,这两步的前提还是你已经添加了第一个工具包。


    编写C++代码:

    接下来,就可以试着去写你的C++代码了(就在刚刚生成的那个William_Hello_JNI.cpp中去编写)。我的示例是这样的:

    #include <jni.h>
    #include <string.h>
    
    extern "C" {
    	JNIEXPORT jstring JNICALL Java_com_demo_jni_MainActivity_sayhello(JNIEnv * env, jobject obj);
    }
    
    JNIEXPORT jstring JNICALL Java_com_demo_jni_MainActivity_sayhello(JNIEnv * env, jobject obj) {
    	return env->NewStringUTF("Hello From cpp.");
    }

    对于上面的C++代码可以看到有一个方法:JNIEXPORT jstring JNICALL Java_com_demo_jni_MainActivity_sayhello(JNIEnv * env, jobject obj);

    其中的组成部分说明如下:

    JNIEXPORT 固定部分,表示JNI外部引入

    jstring 表示返回类型

    JNICALL 固定部分,顾名思义,是表示此方法提供给JNI层去调用

    Java 固定部分,表示后面的部分是Java代码的内容

    com_demo_jni 是Java代码中的程序包名

    MainActivity 表示相应方法所在的类名

    sayhello 就是这里与Java代码中一一对应的方法名


    编写Java代码:

    对于Java代码第一步要做的事件就是引入C/C++中的库,这里的库就是我们在添加本地支持的时候生成的Android.mk文件中的LOCAL_MODULE的值。

    例如我的工程中就是:

    static {
    	System.loadLibrary("William_Hello_JNI");
    }
    完整主函数,如下:

    public class MainActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		EditText showJNI = (EditText) findViewById(R.id.activity_main_jni_show);
    		
    		showJNI.setText(sayhello());
    	}
    	
    	public native String sayhello();
    	
    	static {
    		System.loadLibrary("William_Hello_JNI");
    	}
    }

    运行效果图:



    源码下载:

    工程源码:http://download.csdn.net/detail/u013761665/8369031


    参考

    参考博文:http://blog.csdn.net/yf210yf/article/details/9264587

  • 相关阅读:
    二十四 多重继承
    二十三 使用@property
    Tornado 协程
    基于协程的Python网络库gevent
    用greenlet实现Python中的并发
    在Nginx上配置多个站点
    python 使用Nginx和uWSGI来运行Python应用
    在Apache中运行Python WSGI应用
    Python打包分发工具setuptools
    Python 远程部署 Fabric
  • 原文地址:https://www.cnblogs.com/fengju/p/6336122.html
Copyright © 2020-2023  润新知