其他分享
首页 > 其他分享> > JNI开发:静态注册和动态注册

JNI开发:静态注册和动态注册

作者:互联网

1. 静态注册

jni开发中默认注册方式为静态注册,具体如下:

 

// MainActivity.java
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = findViewById(R.id.sample_text); tv.setText(stringFromJNI()); } public native String stringFromJNI(); }
// native-lib.cpp
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myndkproject_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++ 静态注册";
    return env->NewStringUTF(hello.c_str());
}

在java中通过native stringFromJNI()调用Java_com_example_myndkproject_MainActivity_stringFromJNI,达到使用C++代码开发核心内容的目的。

2. 动态注册

// MainActivity.java
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
Log.i("MainActivity",add_java(1,2)+"");
}
public native String stringFromJNI();
public native int add_java(int a,int b);

}
 
// native-lib.cpp
jstring stringFromJNI(JNIEnv *env, jobject thiz){
    std::string hello = "Hello from C++ 动态注册";
    return env->NewStringUTF(hello.c_str());
}

jint add_jni(JNIEnv *env,jobject thiz,jint a, jint b )
{
    return a+b;
}

static const JNINativeMethod gMethods[] = {
        {"stringFromJNI", "()Ljava/lang/String;", (jstring*)stringFromJNI},
        {"add_java","(II)I",(jint*)add_jni},

};

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){

    __android_log_print(ANDROID_LOG_INFO, "native", "Jni_OnLoad");
    JNIEnv* env = NULL;
    if(vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) //从JavaVM获取JNIEnv,一般使用1.4的版本
        return -1;
    jclass clazz = env->FindClass("com/example/myndkproject/MainActivity");
    if (!clazz){
        __android_log_print(ANDROID_LOG_INFO, "native", "cannot get class: com/example/myndkproject/MainActivity");
        return -1;
    }
    if(env->RegisterNatives(clazz, gMethods, sizeof(gMethods)/sizeof(gMethods[0])))
    {
        __android_log_print(ANDROID_LOG_INFO, "native", "register native method failed!\n");
        return -1;
    }
    return JNI_VERSION_1_4;
}

 

标签:return,env,静态,MainActivity,注册,stringFromJNI,JNI,JNIEnv,native
来源: https://www.cnblogs.com/lewis-lau/p/14178108.html