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

2019-08-12  本文已影响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"));
    }
}
上一篇下一篇

猜你喜欢

热点阅读