目录
- 一、概述
- 二、实例
- 三、总结
一、概述
这里主要通过一系列实例,理解和提高jni编程。最后能够轻松移植各种音视频解码器、ffmpeg、opencv到android studio工程中去。以前一直有做过和看过android系统的jni相关调用,这次是一个总结和提高。
二、实例
1、java上的实例
class Hello {
static{
System.loadLibrary("hello");
}
public static void main(String[] args) {
Hello hello = new Hello();
hello.printHello();
}
public native void printHello();
}
javac Hello.java,生成Hello.class。用javah -jni Hello,生成Hello.h.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */
#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
* Method: printHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hello_printHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
新建Hello.cpp。通过gcc -fPIC -shared -I/usr/lib/jvm/java-7-openjdk-amd64/include Hello.cpp -o libhello.so,生成动态共享库。
#include <stdio.h>
#include "Hello.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
* Method: printHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hello_printHello(JNIEnv *, jobject) {
printf("hello world.\n");
}
#ifdef __cplusplus
}
#endif
执行java Hello,出现
LD_LIBRARY_PATH=. ;export LD_LIBRARY_PATH或java -Djava.library.path=. Hello
2、android studio上的实例
在MainActivity中添加native接口,然后调用。然后在jni中添加对应的函数接口,调用。通过cout或print是在logcat看不到打印的,需要调用__android_log_print函数。
实现结果:
三、总结
.............