?? Android Studio 版本 ????
??? 創(chuàng)建包含JNI的類 JNIAccessMethod.java ??
package com.cmake.ndk1.jni; import com.cmake.ndk1.model.Animal; public class JNIAccessMethod { static { System.loadLibrary("access-method-lib"); } public native void accessInstanceMethod(Animal animal); public native void accessStaticMethod(Animal animal); }
??? Java方法對應Native層方法名稱 ??
* |Java |JNI | * |String fun() |()Ljva/lang/String; | * |long f(int i,Class c); |(ILjava/lang/Class;)J | * |String(byte[] bytes); |([B)V |
?? 配置動態(tài)庫名稱 ???
add_library( #動態(tài)庫名稱 access-method-lib access-method-lib SHARED jni/jni_access_method.cpp )
?? 生成可關聯(lián)的庫鏈接 ???
為了讓Java能夠調(diào)用?access-method-lib 庫中的函數(shù),您需要使用 CMake 構建腳本中的?target_link_libraries()?命令來關聯(lián)?access-method-lib 庫
target_link_libraries( # Specifies the target library. ndk1 person-lib dynamic-lib basic-type-lib string-lib reference-type-lib access-field-lib access-method-lib # Links the target library to the log library # included in the NDK. ) )
??? 提供給 jni 調(diào)用的日志庫鏈接 ??
target_link_libraries( # Specifies the target library. access-method-lib # Links the target library to the log library # included in the NDK. ${log-lib})
??? Native層實現(xiàn) JNIAccessMethod 類下面的JNI接口 ??
實現(xiàn)調(diào)用 callInstanceMethod() 函數(shù)
extern "C" JNIEXPORT void JNICALL Java_com_cmake_ndk1_jni_JNIAccessMethod_accessInstanceMethod(JNIEnv *env,jobject instance, jobject animal) { jclass cls = env->GetObjectClass(animal); //查找Animal對象中的callInstanceMethod()函數(shù),函數(shù)需要傳遞的參數(shù)是int類型對應I, //返回返回為void對應V jmethodID mid = env->GetMethodID(cls,"callInstanceMethod","(I)V"); env->CallVoidMethod(animal,mid,2); }
?實現(xiàn)調(diào)用Animal中 callStaticMethod() 函數(shù)并傳遞字符串參數(shù)
extern "C" JNIEXPORT void JNICALL Java_com_cmake_ndk1_jni_JNIAccessMethod_accessStaticMethod(JNIEnv *env,jobject instance, jobject animal) { jclass cls = env->GetObjectClass(animal); //查找Animal對象中的callStaticMethod()函數(shù),函數(shù)需要傳遞的參數(shù)是int類型對應I, //返回返回為void對應V jmethodID mid = env->GetStaticMethodID(cls,"callStaticMethod", "(Ljava/lang/String;)Ljava/lang/String;"); //構造一個調(diào)用callStaticMethod()函數(shù)需要傳遞的參數(shù) jstring parJString=env->NewStringUTF("jstrinig"); env->CallStaticObjectMethod(cls,mid,parJString); }
?實現(xiàn)調(diào)用Animal中 callStaticMethod() 函數(shù)并?傳遞集合和集合長度到參數(shù)文章來源:http://www.zghlxwxcb.cn/news/detail-600770.html
extern "C" JNIEXPORT void JNICALL Java_com_cmake_ndk1_jni_JNIAccessMethod_accessStaticMethod(JNIEnv *env,jobject instance, jobject animal) { jclass cls = env->GetObjectClass(animal); //查找Animal對象中的callStaticMethod()函數(shù),函數(shù)需要傳遞的參數(shù)是int類型對應I, //返回返回為void對應V jmethodID mid = env->GetStaticMethodID(cls,"callStaticMethod", "(Ljava/lang/String;)Ljava/lang/String;"); //構造一個調(diào)用callStaticMethod()函數(shù)需要傳遞的參數(shù) jstring parJString=env->NewStringUTF("jstrinig"); env->CallStaticObjectMethod(cls,mid,parJString); mid = env->GetStaticMethodID(cls,"callStaticMethod", "([Ljava/lang/String;I)Ljava/lang/String;"); //在Native構建Java的字符串數(shù)組 jclass strClass = env->FindClass("java/lang/String"); int size=2; jobjectArray strArray = env->NewObjectArray(size,strClass, nullptr); jstring strItem; //循環(huán)添加字符串到strArray集合中 for (int i = 0; i < size; ++i) { strItem = env->NewStringUTF("string in native"); env->SetObjectArrayElement(strArray,i,strItem); } //調(diào)用靜態(tài)方法 env->CallStaticObjectMethod(cls,mid,strArray,size); }
??? 調(diào)用Native層函數(shù)操作Animal 中的函數(shù)????
package com.cmake.ndk1; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.cmake.ndk1.jni.JNIAccessField; import com.cmake.ndk1.jni.JNIAccessMethod; import com.cmake.ndk1.model.Animal; public class MainActivity7 extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); JNIAccessMethod jniAccessMethod=new JNIAccessMethod(); Animal animal=new Animal("animal"); final TextView textView=findViewById(R.id.sample_text); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { jniAccessMethod.accessInstanceMethod(animal); jniAccessMethod.accessStaticMethod(animal); } }); } }
D/Animal: call instance method and num is 2 D/Animal: call static method with jstrinig D/Animal: call static method with string array D/Animal: str in array is string in native D/Animal: str in array is string in native
?下載案例文章來源地址http://www.zghlxwxcb.cn/news/detail-600770.html
到了這里,關于Android Java代碼與JNI交互 JNI訪問Java類方法 (七)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!