美文网首页
Android Studio 生成so库 第三篇 简单记录 供其

Android Studio 生成so库 第三篇 简单记录 供其

作者: 大川的川 | 来源:发表于2019-08-12 18:09 被阅读0次

    Android Studio 生成so库 第一篇
    Android Studio 生成so库 第二篇

    根据前两篇,大概了解了android studio中生成so库的步骤和方式,那么下面生成so库,供其他工程调用,具体的怎么生成cpp文件,这里就不再阐述了,接着写cpp文件。

    demo.cpp

    #include <jni.h>
    /* Header for class com_test_testjni_JniTest 生成so库的依赖类文件 */
    #define JNIREG_CLASS "com/test/testjni/JniTest" 
    /* 将通过java函数映射的C函数 */
    jstring getStringCpp(JNIEnv *env, jobject obj, jstring str);
    static JNINativeMethod gMethods[] = {
            { "getStringFromNative", "(Ljava/lang/String;)Ljava/lang/String;", (void*)getStringCpp},
    };
    /* 注册C函数 */
    static int registerNativeMethods(JNIEnv* env, const char* className,
                                     JNINativeMethod* gMethods, int numMethods)
    {
        jclass clazz;
        clazz = (env)->FindClass(className);
        if (clazz == NULL) {
            return JNI_FALSE;
        }
        if ((env)->RegisterNatives(clazz, gMethods, numMethods) < 0) {
            return JNI_FALSE;
        }
        return JNI_TRUE;
    }
    /* 注册C函数 */
    static int registerNatives(JNIEnv* env)
    {
        if (!registerNativeMethods(env, JNIREG_CLASS, gMethods,
                                   sizeof(gMethods) / sizeof(gMethods[0])))
            return JNI_FALSE;
    
        return JNI_TRUE;
    }
    /* cpp文件加载 */
    jint JNI_OnLoad(JavaVM* vm,void* reserved){
        //anti_debug();
        JNIEnv* env;
        if ((vm)->GetEnv((void**)(&env), JNI_VERSION_1_6) != JNI_OK)
        {
            return -1;
        }
        if (!registerNatives(env)) {//注册
            return -1;
        }
        return JNI_VERSION_1_6;
    }
    
    __attribute__((section (".mytext")))
    JNICALL jstring getStringCpp
            (JNIEnv *env, jobject obj, jstring str) {
        const char *strAry = (env)->GetStringUTFChars(str, 0);
        return (env)->NewStringUTF(strAry);
    }
    

    clean project 之后 rebuild project 找到生成的so库,然后放到我们需要添加的工程中

    新工程,将so库放到libs下,工程下创建com/test/testjni/JniTest.java的类文件

    JniTest.java 加载so库

    public class JniTest {
        // 加载native-jni
        static {
            System.loadLibrary("demoCPP");
        }
        public static native String getStringFromNative(String str);
    }
    

    MainActivity中的调用

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TextView textView=findViewById(R.id.txtView);
            textView.setText(JniTest.getStringFromNative("太神奇了!!~~66666666"));
        }
    }
    

    相关文章

      网友评论

          本文标题:Android Studio 生成so库 第三篇 简单记录 供其

          本文链接:https://www.haomeiwen.com/subject/olnujctx.html