[英]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.