2020-11-11(C语言下JNI开发hello过程)
jni _helloworld
a.聲明一個(gè)native方法,native方法不用實(shí)現(xiàn)
//通過native關(guān)鍵字 聲明了一個(gè)本地方法, 本地方法不用實(shí)現(xiàn) ,需要jni調(diào)用c的代碼來實(shí)現(xiàn)
public native String helloInC();
b.項(xiàng)目根目錄下創(chuàng)建的jni文件夾,在jni目錄下創(chuàng)建.c代碼
c函數(shù)命名規(guī)則 Java_包名_native方法所在類名_native方法名(JNIEnv* env,jobject thiz)
#include<stdlib.h>
#include<stdio.h>
#include<jni.h>
//本地函數(shù)命名規(guī)則 Java_包名_native方法所在類名_native方法名
//第二個(gè)參數(shù) jobject就是調(diào)用當(dāng)前native方法的java對象
//第一個(gè)參數(shù) JNIEnv* JNIEnv是結(jié)構(gòu)體,JNINativeInterface這個(gè)結(jié)構(gòu)體的一級指針
//env又是JNIEnv的一級指針,那么env就是JNINativeInterface的二級指針
//結(jié)構(gòu)體JNINativeInterface定義了大量的函數(shù)指針,這些函數(shù)指針在JNI開發(fā)中十分常用
//(env).func (*env)—>func
//jstring Java_com_example_hellojni_Hellojni_stringFromJNI(JNIEnv * *env,jobject thiz)
jstring Java_com_example_hellojni_Hellojni_stringFromJNI(JNIEnvenv,jobject thiz){
//jstring (NewStringUTF)()JNIEnv,const char*) 指針函數(shù)
char* str="hello ";
//通過newSrting把c的字符串轉(zhuǎn)換成java的jstring類型
return (*env)—>NewStringUTF(env,str);
}
3.在jni目下創(chuàng)建一個(gè) Android.mk
#mk (makefile)作用就是向編譯系統(tǒng)描述,我要編譯的文件在什么位置,要生成的文件叫什么名字,是什么類型
LOCAL_PATH:=$(call my-dir)
#清除上次編譯的信息
include $(CLEAR_VARS)
#在這里指定最后生成的文件的名字
LOCAL_MODOULE :=hello
LOCAL_SRC_FILES :=hello.c
#要編譯的c的代碼的文件名
include $(BUILD_SHARED_LIBRARY)
#要生成的是一個(gè)動(dòng)態(tài)鏈接庫(linux動(dòng)態(tài)鏈接庫是.so,windows動(dòng)態(tài)鏈接庫是.dll)
4.通過ndk-build在項(xiàng)目根目錄下編譯.c文件生成.so
5.調(diào)用.so之前需要使用system.loadlibrary來加載.so文件
public void jniHello(View v){
System.loadlibrary(“hello”);
//調(diào)用本地方法,并且把返回的值通過toast顯示出來
Toast.maketext(this,helloInc(),Toast.LENGTH_SHORT).show();
}
}
總結(jié)
以上是生活随笔為你收集整理的2020-11-11(C语言下JNI开发hello过程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020-11-11(aidl)
- 下一篇: 2020-11-12(JNI开发常见错误