android初涉JNI
16lz
2021-01-25
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
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
更多相关文章
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- Android(安卓)开发工具(以后持续更新)
- android避免回复出厂设置导致数据丢失的办法
- android生成的apk文件反编译源代码然后修改
- 解决eclipse中overlaps the location of another project: 'xxxx
- android编译错误(二)