【问题标题】:why app_process run java method get killed after call JNI为什么app_process run java方法在调用JNI后被杀死
【发布时间】:2022-09-26 06:47:47
【问题描述】:

这是我所做的:

  1. 使用android studio模板创建Native C++项目
  2. 创建一个类 com.jnitest.app.JNIInterface
    package com.jnitest.app;
    
    public class JNIInterface {
        public static native String getString();
        public static native String getName();
    }
    
    
    

    使用 native-lib.cpp

    #include <jni.h>
    #include <string>
    
    extern \"C\" JNIEXPORT jstring JNICALL
    Java_com_jnitest_app_JNIInterface_getString(JNIEnv *env, jclass thiz) {
        std::string name = \"return String from JNIInterface\";
        return env->NewStringUTF(name.c_str());
    }
    
    extern \"C\"
    JNIEXPORT jstring JNICALL
    Java_com_jnitest_app_JNIInterface_getName(JNIEnv *env, jclass clazz) {
        std::string name = \"return name from JNIInterface\";
        return env->NewStringUTF(name.c_str());
    }
    
    1. 创建一个测试类com.jnitest.app.JNITest
    package com.jnitest.app;
    
    public class JNITest {
        {
            System.loadLibrary(\"app\");
        }
        public static void main(String[] args) {
            System.out.println(\"Hello from JNITest\");
            System.out.println(\"String from JNI: \" + JNIInterface.getString());
        }
    }
    
    
    1. 构建推送并运行
    adb push .\\build\\intermediates\\apk\\debug\\app-debug.apk /data/local/tmp/app-debug.jar 
    
    adb shell CLASSPATH=/data/local/tmp/app-debug.jar  app_process ./ com.jnitest.app.JNITest
    
    1. 获取输出
    Hello from JNITest
    Killed
    

    为什么我不能得到正确的结果?

标签: java android c++ adb


【解决方案1】:

我也有这个问题。 ClassLoader 找不到本机库。试试下面的。

  1. useLegacyPackaging false需要添加到build.gradle,这样库就不会被压缩,可以直接从apk内部加载。
    android {
        packagingOptions {
            jniLibs {
                useLegacyPackaging false
            }
        }
    }
    
    1. 以这种方式加载您的本机库。
    package com.jnitest.app;
    
    public class JNITest {
        public static void main(String[] args) {
            System.out.println("Hello from JNITest");
            System.out.println("String from JNI: " + JNIInterface.getString());
        }
        static {
            String libPath = System.getenv("CLASSPATH") +
                    "!/lib/" + Build.SUPPORTED_ABIS[0] +
                    "/libapp.so";
            System.err.println("Loading shared library: " + libPath);
            System.load(libPath);
        }
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多