`
koliy
  • 浏览: 147110 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

android初涉JNI

jni 
阅读更多
1.打开eclipse新建一个android的工程,就叫"helloworld"吧。建立后添加一个class文件作为jni的接口,包名:package mtk.abc; 类名:Uart
public class Uart{ 

    public native void print(); 

static{

        try{  
            Log.i("JNI","try to load libmtkserial.so");  
            System.loadLibrary("mtkserial");    
    //加载本地库,也就是JNI生成的libxxx.so文件,下面再说。  
        }catch (UnsatisfiedLinkError ule){  
            Log.e("JNI","WARNING: Could not load libmtkserial.so");  
        }
}
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_uart);
        this.print();
    }
-------------
这个就是native code在java中的接口了。添加完成后,project/build project(有时候需去掉build automaticaily才能选择。第一步的准备工作就此完成,很容易吧。
------------------
2.打开cmd并定位到刚刚新建的"helloworld"工程目录下的bin/classes目录,执行”javah -classpath .  -jni  mtk.abc.Uart“,没有意外的话,bin/classes目录下应该会产生一个mtk_abc_Uart.h文件。这个就是native code需要实现的函数了。
-jni  mtk.abc.Uart: 指定class目录下的所要编译的类文件名。
如:\bin\classes\mtk\abc 下有定义的各种类文件!如jni像跟service接口,定义个一个bindservice.java。则\bin\classes\mtk\abc下就有个bindservice.class。
我们指定 -jni  mtk.abc.bindservice就可以了。
-------------------
3.现在我们把刚刚得到的.h文件拷贝出,到工程目录下,并建立子目录jni(必须叫这个,否则后面会不能编译哦),并将.h文件拷贝到该目录下,并新建一个mtk_abc_Uart.c文件实现相关函数,代码如下:

#include <string.h> 

02 #include "mtk_abc_Uart.h" 


06 JNIEXPORT void JNICALL Java_mtk_abc_Uart_print
07   (JNIEnv *env, jobject thiz) 

08   { 

09       

10   } 

--------------------
接着还需要同一个目录下添加一个Android.mk文件,编译时候使用,具体内容如下:


LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := mtkserial   (最终so文件名是libmtkserial.so)

LOCAL_SRC_FILES := mtk_abc_Uart.c 
include $(BUILD_SHARED_LIBRARY)

--------------
4.把hellworld工程包放入ndk工具目录里面
然后进入要编译的目录 \ndk(ndk的目录路径)\helloworld\
执行外面的工具 #: ..\ndk-build
可以了。会在libs\armeabi下生成 so文件。
把工程考出,然后编译烧录到板子上就可以了。
=====================================================
注意:
当出现错误信息:
make: /home/mx515/android-ndk-r9/samples/wireless/build/core/build-local.mk: No such file or directory
make: *** No rule to make target `/home/mx515/android-ndk-r9/samples/wireless/build/core/build-local.mk'.  Stop.
-------------------
这时,我们就需要配置NDK的环境变量了。
vim  /etc/bash.bashrc

export NDK=/home/mx515/android-ndk-r9
export PATH=$PATH:$NDK
-------------------------
# source  /etc/bash.bashrc
# echo $PATH
:/home/mx515/android-ndk-r9
----
因此我们可以用 ndk的命令了。
root@ubuntu:/home/mx515/android-ndk-r9/samples/wireless# ndk-
ndk-build       ndk-gdb         ndk-gdb-py.cmd 
ndk-build.cmd   ndk-gdb-py      ndk-stack      
ndk-depends     ndk-gdb.py      ndk-which
===============================
我们在 需要产生 so文件的目录下 执行 ndk-build 就可以了。

如:

root@ubuntu:/home/mx515/android-ndk-r9/samples/wireless# ndk-build
Android NDK: WARNING: APP_PLATFORM android-9 is larger than android:minSdkVersion 4 in ./AndroidManifest.xml   
Compile thumb  : wireless <= nsk_rdev_wireless.c
SharedLibrary  : libwireless.so
Install        : libwireless.so => libs/armeabi/libwireless.so
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics