zoukankan      html  css  js  c++  java
  • Android开发之JNI(一)--HelloWorld及遇到的错误解析

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


    1.NDK环境搭建


    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-ndksampleshello-jnijniApplication.mk
    android-ndksampleshello-jnijniAndroid.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-windowsandroid-ndkplatformsandroid-19arch-armusrinclude,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

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

    1. APP_PLATFORM := android-8  
    当中8就是指的minSdkVersion。依据自己的实际情况进行替换!

    4.ANDROIDNDK:WARINGUnsupported source file extensions in jni/Android.mk for module XXXX
    这是由于我在做的时候把
    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!

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


  • 相关阅读:
    [转]ASP.NET会话(Session)保存模式
    ASP.NET 2.0 实现伪静态网页方法
    显示带颜色的字符串
    sublime text 3.0使用
    sublime text插件
    cogs1715 动态逆序对
    双网卡bond
    解决CentOS6不能使用yum源
    查看磁盘io占用
    [office] 在word中的小技巧
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6789000.html
Copyright © 2011-2022 走看看