一、設置NDKjava
local.propertieswindows
ndk.dir=C\:\\Users\\dong\\AppData\\Local\\Android\\Sdk\\ndk-bundle
sdk.dir=C\:\\Users\\dong\\AppData\\Local\\Android\\Sdk
二、建立JNI.javaapp
package com.example.dong.ndkdemo;
public class JNI {
{
System.loadLibrary("hello"); } // native 用於調用C對應的函數 public native String sayHello(); }
三、main下建立jni目錄,建立文件Hello.c,Android.mkide
Hello.c函數
#include <jni.h> //方法名必須爲本地方法的全類名點改成下劃線,穿入的兩個參數必須這樣寫, //第一個參數爲Java虛擬機的內存地址的二級指針,用於本地方法與java虛擬機在內存中交互 //第二個參數爲一個java對象,便是哪一個對象調用了這個 c方法 jstring Java_com_example_dong_ndkdemo_JNI_sayHello(JNIEnv* env,jobject obj){ char* text="I from C"; return (*env)->NewStringUTF(env,text); }
Android.mk測試
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #編譯生成的文件的類庫叫什麼名字 LOCAL_MODULE := hello #要編譯的c文件 LOCAL_SRC_FILES := Hello.c include $(BUILD_SHARED_LIBRARY)
四、設置app/bulid.gradlegradle
defaultConfig { ........
....... ndk{ moduleName "Hello"//so文件 app/build/intermediates/ndkBuild/debug/obj/local/{*}/libhello.so abiFilters "armeabi-v7a","arm64-v8a","x86","x86_64"//cpu類型arm、 mips "armeabi" } }
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
5\修改文件ui
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String result=new JNI().sayHello(); System.out.println("result=="+result); } }
繼續測試spa
一、File------New Module ----名稱javaCallC命令行
二、建立JNI.java
public class JNI { public native int add(int a,int b); public native String sayHello(String s); public native int[] increateArrayEles(int[] intArray); public native int checkPwd(String pwd); }
三、生成頭文件
在Terminal中進入切換至目錄 javacallc\src\main\jni
執行javah com.example.javacallc.JNI
X:\**\**\javacallc\src\main\java>javah com.example.javacallc.JNI javah javac 不是內部或外部命令 解決方法 這是由於java10已經移除了javah的相關功能。
爲了使用java 10生成頭文件,在windows的cmd命令行中使用如下命令:
javacallc\src\main\java\com\example\javacallc>javac -h . JNI.java
這樣就會生成com_example_javacallc_JNI.h 文件,將文件移動到jni目錄