簡體   English   中英

在新的Android項目中使用.so文件時,是否必須遵循與so文件相同的軟件包名稱

[英]Is it necessary to follow same package name as it was for so file while using .so file in new Android project

我使用本地c ++支持創建了一個項目。 在這個項目中,我將int值從活動傳遞給c ++代碼,本機代碼返回此值是否為素數。 這完美地工作,現在我想創建.so文件以在另一個項目中使用。 我在Google上發布了很多帖子,但沒有得到答案如何為所有設備獲取不同的.so文件。 因此,我已將.apk文件重命名為.zip並將其解壓縮。 之后,我得到了一個.so文件。

現在,我想在另一個項目中使用此.so文件。 因此,我用不同的名稱創建了新項目,但包名稱相同。 我在src / main中創建了一個目錄,並將其命名為jniLib,在該lib中,我復制了.so文件目錄。 在我的MainActivity中,我將文件加載為static { System.loadLibrary("native-lib"); } static { System.loadLibrary("native-lib"); }

並調用我的本機方法private native String isPrimeNumber(int number); 在這里,一切都是完美的。 現在,無需實際的c ++代碼即可獲得結果。

現在,我再次創建了一個新項目,並按照上述步驟進行操作,接着創建了第二個項目,但是區別在於現在我已經更改了應用程序的程序包名稱。 當我運行應用程序時,我的應用程序因錯誤而崩潰

FATAL EXCEPTION: main
                                                                                Process: com.app.androidkt.differentpackage, PID: 16970
                                                                                java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.app.androidkt.differentpackage.MainActivity.isPrimeNumber(int) (tried Java_com_app_androidkt_differentpackage_MainActivity_isPrimeNumber and Java_com_app_androidkt_differentpackage_MainActivity_isPrimeNumber__I)
                                                                                    at com.app.androidkt.differentpackage.MainActivity.isPrimeNumber(Native Method)
                                                                                    at com.app.androidkt.differentpackage.MainActivity.access$000(MainActivity.java:10)
                                                                                    at com.app.androidkt.differentpackage.MainActivity$1.onClick(MainActivity.java:38)
                                                                                    at android.view.View.performClick(View.java:5268)
                                                                                    at android.view.View$PerformClick.run(View.java:21550)
                                                                                    at android.os.Handler.handleCallback(Handler.java:822)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:104)
                                                                                    at android.os.Looper.loop(Looper.java:207)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5811)
                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:681)

所以我的問題是-1)在我們的應用程序中使用.so文件是否需要使用與.so文件相同的軟件包名稱。 2)我如何獲得不同的.so文件目錄-目前暫時我已經從apk中提取了它。 3).so文件的使用是僅隱藏本機代碼,還是還有其他用途?

提前致謝。

您的應用程序包名稱可以是任何名稱,但是使用libnative-lib.so實現的本機方法的Java類必須與該libnative-lib.so文件的作者所期望的完全相同。

設置最簡單的解決方法是將com.app.androidkt.differentpackage.MainActivity類移動到com.app.androidkt.samplendk包中。 Android Studio將幫助您進行此重構。 請注意,現在您必須在AndroidManifest.xml中聲明MainActivity的完整路徑。

另外,您可以創建一個小型com.app.androidkt.samplendk.MainActivity類:

package com.app.androidkt.oldpackage;

public class MainActivity {
  static {
    System.loadLibrary("native-lib");
  }
  public native String isPrimeNumber(int number);
}

並在MainActivity.java中添加幾行:

package com.app.androidkt.differentpackage;

public class MainActivity extends AppCompatActivity {

  private com.app.androidkt.oldpackage.MainActivity pmSolver;
  private String isPrimeNumber(int number) {
    return pmSolver.isPrimeNumber(number);
  }
  …
}

如果您不知道用於此libnative-lib.so的確切軟件包名稱,則可以通過解析其ELF標頭找到它:您將看到一個名為Java_com_app_androidkt_ samplendk_MainActivity_isPrimeNumber的導出函數。


Nitpicker的角落 :可以構建一個JNI庫來隱藏其指定的類名,但是很難可靠地防止對這些名進行反向工程。 還可以構建將無縫連接到不同軟件包的JNI庫。

1)在我們的應用程序中使用.so文件是否需要使用與.so文件相同的軟件包名稱

不,您可以使用所需的任何軟件包名稱

2)我如何獲得不同的.so文件目錄-目前暫時我已經從apk中提取了它

將所有.so文件復制到新項目文件夾:src / main / jniLibs / armeabi

3).so文件的使用是僅隱藏本機代碼,還是還有其他用途?

.so文件是一個庫。 因此,該目的是為了方便地在多個項目中重用已實現的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM