JNI:Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。
JNI可以这样与本地程序进行交互:
1、你可以使用JNI来实现“本地方法”(native methods),并在JAVA程序中调用它们。
2、JNI支持一个“调用接口”(invocation interface),它允许你把一个JVM嵌入到本地程序中。本地程序可以链接一个实现了JVM的本地库,然后使用“调用接口”执行JAVA语言编写的软件模块。例如,一个用C语言写的浏览器可以在一个嵌入式JVM上面执行从网上下载下来的applets。
NDK:native develop kits的缩写,android 本地开发工具集 ,可以把c/c++ ->编译成一个 linux下可以执行的二进制文件 java代码里面就可以通过jni 调用执行二进制的文件.。
默认文件
MainActivity.java
//用于在应用程序启动时加载“本机lib”库。
static {
System.loadLibrary("native-lib");
}
//native标识符表示该方法的实现由非java语言实现
public native String stringFromJNI();//C++方法,返回stringFromJNI
native-lib.cpp
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring
JNICALL
Java_com_zzq_arcameratest_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
CMakeLists.txt
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp )
使用自定义C语言
student.h
#include <jni.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
14 * Class: Java_com_zzq_ctest_MainActivity
15 * Method: getStringFromNative
16 * Signature: (I)I
17 */
JNIEXPORT jstring JNICALL Java_com_zzq_ctest_MainActivity_getStringFromNative//类名+方法名
(JNIEnv *env, jobject jObj);
#ifdef __cplusplus
}
#endif //CTEST_STUDENT_H
student.cpp
#include "student.h"
JNIEXPORT jstring JNICALL Java_com_zzq_ctest_MainActivity_getStringFromNative
(JNIEnv *env, jobject jObj){
//return (*env)->NewStringUTF(env,"Hello From JNI!");
jstring strRet = env->NewStringUTF("HelloWorld from zzq JNI !");
return strRet;
}
cMakeLists.txt
add_library( # Sets the name of the library.
student
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/student.cpp )
MainActivity.java
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("student");
}
tv.setText(getStringFromNative());
public native String getStringFromNative();