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

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


1.NDK环境搭建


2.HelloWorld编写

   (1)新建一个Android工程JniDemo,这个名字可以随便起;

   (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,进入到工程HelloWorld.java类所在目录,运行如下命令
              javac HelloWorld.java
              生成了一个HelloWorld.class的文件
     (5)用cmd返回到工程src目录,运行以下命令
                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)右击工程名,新那一个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下就会编译报错,那么如何修复呢?

只需要在你的工程的:

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!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值