JNI简单入门

1.在目前版本的AndroidStudio(3.2)上默认使用CMake来编译C/C++代码,向cpp文件夹添加新的C/C++代码时,会发现在IDE里并没有显示新添加的文件,这个时候只需要在CMakeList.txt里面添加下面的代码,然后点击Refresh Linked C++ Projects即可

aux_source_directory(src/main/cpp/mycode MY_SRC_LIST)
add_library( # Sets the name of the library.
             libname

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             ${MY_SRC_LIST})

2.在Java代码中添加System.loadLibrary加载so库,然后声明一个native方法,以便在后面的C/C++代码中实现它

public class MyClass {
    static {
        System.loadLibrary("libname");
    }
    public native int setSpeed(double speed);
}

3.在C/C++文件中实现Java中声明的方法,注意名字一定要和java中一致

extern "C" JNIEXPORT jint JNICALL Java_com_xy_test_MyClass_setSpeed(
        JNIEnv *env,
        jobject /* this */,jdouble speed) {
    g_speedValue=speed;
    return 0;
}

4.下面是JNI中的数据类型与JAVA,C/C++中的对应关系

  映射

 类型

Java类型

JNI本地类型

C类型

type/bits

type/bits/signatures

type/bits

 

 

 

基本

类型

boolean

8

jboolean

u8

Z

-

 

byte

8

jbyte

8

B

-

 

char

16

jchar

u16

C

char

8

short

16

jshort

16

S

short

16

int

32

jint

32

I

int

32

long

64

jlong

64

J

long

32

float

32

jfloat

32

F

float

32

double

64

jdouble

64

D

double

64

 

void

-

Void

N/A

V

void

-

 

 

 

 

 

 

引用

类型

Object

-

jobject

-

-

-

-

Class

-

jclass

-

L fully-qualified-class;

-

-

String

-

jstring

-

Ljava/lang/String;

-

-

arrays

-

jarray

-

-

-

-

object arrays

-

jobjectArray

-

[L fully-qualified-class;

-

-

boolean arrays

-

jbooleanArray

-

[Z

-

-

byte arrays

-

jbyteArray

-

[B

-

-

char arrays

-

jcharArray

-

[C

-

-

short arrays

-

jshortArray

-

[S

-

-

int arrays

-

jintArray

-

[I

-

-

long arrays

-

jlongArray

-

[J

-

-

float arrays

-

jfloatArray

-

[F

-

-

double arrays

-

jdoubleArray

-

[D

-

-

Throwable

-

jthrowable

-

Ljava/lang/Throwable;

-

-

posted @ 2018-09-20 23:11  土豆吞噬者  阅读(143)  评论(0编辑  收藏  举报