今天试着在Ubutnu环境下,编写了一个NDK的helloworld的程序,并在此归纳总结想下:

1.首先建一个Android Project工程,并创建一个类,如下:

package com.android.study;public class DemoTest {    static {        System.loadLibrary("DemoTest");    }    public native String helloWord();}

2.通常使用的是Eclipse开发工具,Eclipse会自动编译生成.class文件,如没有采用自动话编辑工具,可以使用javac工具进行编译,生成对应的.class文件。



3. 在项目根目录下面新建jni文件夹,并使用javah 工具 生成对应的.h

进入项目的/bin/classes 目录下,然后运行如下命令:

javah -classpath . -jni com.android.study.DemoTest

把生成的.h拷贝到jni文件下面


或者直接在项目根目录下面运行如下命令:
javah -classpath bin/classes -d jni com.android.study.DemoTest

-classpath bin:表示类的路劲
-d jni: 表示生成的头文件存放的目录
com.example.hellojni.HelloJni 则是完整类名

备注:如有提示javah工具没有,但的确自己已经安装了,那是因为/usr/bin/ 目录下没有相应的链接,使用下面命令创建链接或者设置相应的环境变量即可

sudo ln -s '/usr/local/java/jdk1.6.0_31/bin/javah' /usr/bin/javah

然后在该目录下就可以找到自己需要的.h文件了,具体内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_android_study_DemoTest */#ifndef _Included_com_android_study_DemoTest#define _Included_com_android_study_DemoTest#ifdef __cplusplusextern "C" {#endif/* * Class:     com_android_study_DemoTest * Method:    helloWord * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_android_study_DemoTest_helloWord  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
4.编写.c文件

#include <string.h>#include <jni.h> jstring JNICALL Java_com_android_study_DemoTest_helloWord(JNIEnv *env, jobject object) {     return (*env)->NewStringUTF(env, "Hello world JNI !");}

5.编写Android.mk文件 类似与makefile

# Copyright (C) 2009 The Android Open Source Project## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at##      http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.#LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := DemoTestLOCAL_SRC_FILES := demo.cinclude $(BUILD_SHARED_LIBRARY)

LOCAL_PATH := $(call my-dir)
一个Android.mk 文件首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。
include $( CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),
除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
LOCAL_MODULE := hello-jni
编译的目标对象,LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。
注意:编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'hello-jni'的共享库模块,将会生成'libhello-jni.so'文件。
重要注意事项:
如果你把库命名为‘libhello-jni’,编译系统将不会添加任何的lib前缀,也会生成 'libhello-jni.so',这是为了支持来源于Android平台的源代码的Android.mk文件,如果你确实需要这么做的话。
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
注意,默认的C++源码文件的扩展名是’.cpp’. 指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是’.cxx’,而不是’cxx’)
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY表示编译生成共享库,是编译系统提供的变量,指向一个GNU Makefile脚本,负责收集自从上次调用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。还有 BUILD_STATIC_LIBRARY变量表示生成静态库:lib$(LOCAL_MODULE).a, BUILD_EXECUTABLE 表示生成可执行文件。

6 在项目根目录下面运行ndk-build 生成相应的.so文件
7.在相应的Activity 中调用并显示出来

package com.android.study;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.TextView;public class JniDemoActivity extends Activity implements OnClickListener {    private TextView mContenTextView;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        mContenTextView = (TextView) findViewById(R.id.tv_content);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.btn_submit:                DemoTest test = new DemoTest();                mContenTextView.setText(test.helloWord());                break;            default:                break;        }    }}

至此,一个helloworld工程就OK了。


更多相关文章

  1. android hasSystemFeature函数及系统特性配置
  2. 解决打开Android(安卓)Device Monitor一系列问题
  3. android studio 打包webview 5.0文件上传问题
  4. android电池 framework层
  5. Android(安卓)Aidl 的使用方法
  6. 当sd卡不存在时,保存文件到手机上
  7. Android-Gradle依赖统一管理
  8. 使用Eclipse开发Android源码
  9. Android(安卓)SDK相关介绍

随机推荐

  1. android firstslide
  2. android 官方SDK文档
  3. Android(安卓)常见广告库包名合集
  4. Android(安卓)Property System
  5. Android中GridView区中且行间距设置
  6. Android(安卓)动态获取文本宽度
  7. ch024 Android(安卓)BroadCastReceiver
  8. Android(安卓)实例化
  9. android SQLite
  10. Toast