一、準備步驟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$