一、准备步骤ubuntu下配置好java、gcc相关的环境。java
2.编写java文件linux
class JniTest { private native String getLine(String prompt); public static void main(String args[]) { JniTest jnitest = new JniTest(); String input = jnitest.getLine("Type a line: "); System.out.println("User typed: " + input); } static { System.loadLibrary("JniTest"); } }
三、编译java文件生成classandroid
javac JniTest.java
四、生成 .h 文件ubuntu
javah -jni JniTest
五、根据.h文件编写c代码命令行
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class JniTest */ #ifndef _Included_JniTest #define _Included_JniTest #ifdef __cplusplus extern "C" { #endif /* * Class: JniTest * Method: getLine * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_JniTest_getLine (JNIEnv *JniEnv, jobject obj, jstring inputstr){ char outputstr[50]; int lenght = (*JniEnv)->GetStringLength(JniEnv,inputstr); printf("inputstr lenght= %d" ,lenght); printf("请输入一个字符串返回给java"); scanf("%s",outputstr); return (*JniEnv)->NewStringUTF(JniEnv,outputstr); } #ifdef __cplusplus } #endif #endif
六、若是配置了android NDK的环境,能够用android,mk来编译生成so,从androidNDK的sample里找到一份Android.mk文件,与生成的JniTest.c代码放入jni文件夹下。或者直接用第7步的gcc命令来生成code
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := JniTest LOCAL_SRC_FILES := JniTest.c include $(BUILD_SHARED_LIBRARY)
七、生成so文件,-I的做用是指定jni.h头文件的位置字符串
gcc JniTest.c -I /home/guoshijie/下载/jdk1.8.0_111/include -I /home/guoshijie/下载/jdk1.8.0_111/include/linux -fPIC -shared -o libJniTest.so
八、执行classget
由于生成的so并无放入系统的lib库里,因此须要指定lib库路径input
能够用以下命令指定当前命令行窗口的lib库路径string
/home/guoshijie/test/testc/jni 下放的是生成的so
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/guoshijie/test/testc/jni
或者用
java -Djava.library.path=./jni JniTest
执行出的结果以下
guoshijie@guoshijie-virtual-machine:~/test/testc$ java -Djava.library.path=./jni JniTest inputstr lenght= 13请输入一个字符串返回给javaaaa User typed: aaa guoshijie@guoshijie-virtual-machine:~/test/testc$