Android开发之JNI(一)--HelloWorld及遇到的错误解析

Android开发之JNI(一)--HelloWorld及遇到的错误解析

1.NDK环境搭建

參考http://blog.csdn.net/xiaoliouc/article/details/8705560

2.HelloWorld编写

(1)新建一个AndroidprojectJniDemo,这个名字能够随便起。

(2)新建一个HelloWorld.java类,里面的内容例如以下:

public class HelloWorld {

    public native String print();

    static {
        System.loadLibrary("hello-jni");
    }
}

(3)在MainActivity.java类中调用,例如以下所看到的:

private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.text_view);
        String helloWorld = new HelloWorld().print();
        mTextView.setText(helloWorld);
    }

(4)打开cmd,进入到projectHelloWorld.java类所在文件夹。执行例如以下命令

javac HelloWorld.java

生成了一个HelloWorld.class的文件

(5)用cmd返回到projectsrc文件夹,执行下面命令

javah  com.example.jnidemo.HelloWorld,这时生成一个com_example_jnidemo_HelloWorld.h文件

也能够用命令 javah -classpath . -jni  com.example.jnidemo.HelloWorld

javah -classpath .  com.example.jnidemo.HelloWorld

可是必需在src文件夹下

(6)右击project名,新那一个folder,起名jni,从android ndk文件夹下copy这个两个文件。

android-ndk\samples\hello-jni\jni\Application.mk

android-ndk\samples\hello-jni\jni\Android.mk

然后把com_example_jnidemo_HelloWorld.h重命名为HelloWorld.h这个名字能够任意命也copy到jni文件夹下

(7)编写h文件的实现文件c,此处实现文件为HelloWorld.c。内容例如以下:

(8)打开cygdrive,进入到项目的根文件夹,执行例如以下命令$NDK/ndk-build, $NDK改成自己配的名字;完毕后刷新项目。文件夹下多了obj文件夹

#include  <string.h>
#include <jni.h>

#include "HelloWorld.h"

JNIEXPORT jstring JNICALL Java_com_example_jnidemo_HelloWorld_print
  (JNIEnv* env, jobject thiz) {
	return (*env)->NewStringUTF(env, "Hello World!");
}

(9)Android.mk文件配置例如以下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := HelloWorld.c

include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE后面的值和ystem.loadLibrary("hello-jni");里面的字符串保持一致,表示要载入的模块库

LOCAL_SRC_FILES的值为要编译的源文件

编译好后执行项目,得到了想要的结果

3.在初次编写NDK时可能遇到的一些问题总结:

1. Type ‘*****‘ could not be resolved

Method ‘******‘ could not be resolved等等

解决方法:左键->Properties->C/C++ General->Paths and Symbols->Includes->Add->加入D:\adt-bundle-windows\android-ndk\platforms\android-19\arch-arm\usr\include,NDK的路径

2. 假设还报1的错误,Window->Show View->Problems,清除全部错误,这样就好了。有时候弄好之后,在几个文件之间切换。又会报这种错误,做法继续2.

3.Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8

这是由于NDK指定的版本号与minSdkVersion不一致的问题,这本身仅仅是一个警告。可是在eclipse下就会编译报错,那么怎样修复呢?

仅仅须要在你的project的:

Application.mk

文件里加入例如以下代码就可以:

[cpp] view
plain
copy

  1. APP_PLATFORM := android-8

当中8就是指的minSdkVersion。依据自己的实际情况进行替换!

4.ANDROIDNDK:WARINGUnsupported source file extensions in jni/Android.mk for module XXXX

这是由于我在做的时候把

[cpp] view
plain
copy

  1. LOCAL_SRC_FILES := HelloWorld.h 改成 LOCAL_SRC_FILES := HelloWorld.c

5.obj/local/armeabi-v7a/objs/xxxxx  ****multiple target patterns. Stop

这是删掉obj这个目录。又一次生成$NDK/ndk-build就OK!

假设大家在开发的过程中还遇到别的错误,请在留言贴出问题并附上解决方法,供其它人參考。谢谢!

时间: 2024-12-25 02:00:47

Android开发之JNI(一)--HelloWorld及遇到的错误解析的相关文章

Android开发之JNI调用本地C库专题(一):JNI的使用

JNI,是用于开发本地C函数库的技术.用于链接JAVA和C或者C++语言的桥梁.在部分android项目开发中,我们是需要用到这项技术的.那么废话不多说,进入正题. 开发JNI,需要用到NDK,这个大家应该都知道了.还需要一个linux的开发环境.一般而言,可以使用虚拟机装一个ubantu,博主以前就是搞linux开发的,这点还是比较熟悉.但是对于大部分android开发者而言,弄一个虚拟机成本太高.那么,我们需要搭建一个模拟linux的开发环境.这个博主就不说了,直接上链接 NDK环境搭建 以

【转】Android开发之旅:应用程序基础及组件

为了后面的例子做准备,本篇及接下来几篇将介绍Android应用程序的原理及术语,这些也是作为一个Android的开发人员必须要了解,且深刻理解的东西.本篇的主题如下: 1.应用程序基础 2.应用程序组件 2.1.活动(Activities) 2.2.服务(Services) 2.3.广播接收者(Broadcast receivers) 2.4.内容提供者(Content providers) 因为这些内容比较理论,且没有用例子来说明,看上去会比较枯燥,我就把这几篇写得算比较短,方便大家吸收. 1

Android 开发之旅:深入分析布局文件&amp;又是“Hello World!”

http://www.cnblogs.com/skynet/archive/2010/05/20/1740277.html 引言 上篇可以说是一个分水岭,它标志着我们从Android应用程序理论进入实践,我们拿起手术刀对默认的“Hello World!”程序进行了3个手术,我们清楚了“Hello world!”是如何实现显示在屏幕上的,而且我们知道不仅可以根据布局文件main.xml来初始化屏幕,还可编程地进行.以后基本我们都会以实践的方式来深入Android开发.我们这次深入分析Android

【转】Android 开发之旅:view的几种布局方式及实践

引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理及布局文件可谓有了比较深刻的认识和理解,并且用“Hello World!”程序来实践证明了.在继续深入Android开发之旅之前,有必要解决前两篇中没有介绍的遗留问题:View的几种布局显示方法,以后就不会在针对布局方面做过多的介绍.View的布局显示方式有下面几种:线性布局(Linear Layout).

【转】Android 开发之旅:深入分析布局文件&amp;又是“Hello World!”

引言 上篇可以说是一个分水岭,它标志着我们从Android应用程序理论进入实践,我们拿起手术刀对默认的“Hello World!”程序进行了3个手术,我们清楚了“Hello world!”是如何实现显示在屏幕上的,而且我们知道不仅可以根据布局文件main.xml来初始化屏幕,还可编程地进行.以后基本我们都会以实践的方式来深入Android开发.我们这次深入分析Android应用程序的布局文件,主要内容如下: 1.用户界面及视图层次 2.Android中布局定义方法 3.编写XML布局文件及加载X

Android开发之Tween(补间动画)完全解析(下)

欢迎转载,转载请注明出处:http://blog.csdn.net/dmk877/article/details/51980734 在上一篇文章中,我们详细讨论了Tween动画的xml的实现以及interpolator的使用,相信通过上篇文章大家对Tween动画的xml属性的配置会有一个详细的理解,当然这篇文章也是承接上篇文章,所以强烈建议先阅读上篇文章:Android开发之Tween(补间动画)完全解析(上),这篇文章将从代码的角度实现上篇文章的效果.如有疑问请留言,如有谬误欢迎批评指正. T

Android开发之JSON使用

Android开发之JSON使用 今天在论坛看到有不少朋友问关于json的问题,所以想写一篇关于android中使用json的博客. 首先 json是什么 JSON的全称是JavaScript Object Notation,从这里可以看到它源于JavaScript,它采用文本形式体现.比如 {"name":"zhangsan","age":20,"wife":"如花"} 这个简单表示了一个对象,在java

Android开发之bindService()侦听service内部状态

在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 1 public static interface CallBack{ 2 void onDataChange(String data); 3 } 2. 1 private CallBack callBack=null; 2 public void setCallBack(CallBack callB

Android开发之Fragment详解

Android开发之Fragment学习 1.简介: Fragment是Android 3.0引入的新API. Fragment代表了 Activity的子模块,因此可以把Fragment理解成Activity片段.Fragment用于自己的生命周期,也可以接受它自己的输入事件. Fragment必须被"嵌入" Activity中使用,因此虽然Fragment也拥有自己的生命周期,但Fragment的生命周期会受它所在的Activity的生命周期的控制.例如,当Activity暂停时,